[C++] Quoziente e Resto
Ciao, riflettendo sull'ottimizzazione di una libreria sui "big int" da me scritta, mi sono focalizzato sul fatto che la funzione di divisione (che sfrutta più o meno l'algoritmo della classica divisione in colonna insegnata a scuola) calcola contemporaneamente sia il quoziente che il resto, per poi ritornare l'uno o l'altro in base alla richiesta; quindi se per uno stesso dividendo e divisore mi servono sia quoziente che resto, dovrò eseguire la funzione due volte.
Detto ciò, prima di cimentarmi in soluzioni fantasiose, mi chiedevo se qualcosa di simile avviene anche per la divisione intera nativa e nel caso come viene gestito il tutto?!
Detto ciò, prima di cimentarmi in soluzioni fantasiose, mi chiedevo se qualcosa di simile avviene anche per la divisione intera nativa e nel caso come viene gestito il tutto?!
Risposte
Ho fatto qualche ricerca, e com'era prevedibile esiste una funzione [inline]std::div()[/inline] che ritorna quoziente e resto mediante un'apposita struct.
Inoltre ho letto che molti compilatori in casi come il seguente
sono in grado di ottimizzare il tutto eseguendo una sola divisione.
A tal proposito le due istruzioni devono essere per forza consecutive? Questa ottimizzazione vale solo per la divisione intera nativa o anche in presenza di overload degli operatori [inline]/[/inline] e [inline]%[/inline]?
Inoltre ho letto che molti compilatori in casi come il seguente
int q = a / b; int r = a % b
sono in grado di ottimizzare il tutto eseguendo una sola divisione.
A tal proposito le due istruzioni devono essere per forza consecutive? Questa ottimizzazione vale solo per la divisione intera nativa o anche in presenza di overload degli operatori [inline]/[/inline] e [inline]%[/inline]?
Ogni compilatore si comporta in modo differente e lo stesso compilatore può avere comportamenti differenti in base alla versione e alle opzioni usate per compilare.
Quindi in definitiva la cosa migliore rimane implementare qualcosa come [inline]std::div()[/inline] e lasciare all'utente la possibilità di sfruttare o meno tale ottimizzazione?
Nel caso di una libreria per big int la soluzione corretta è certamente quella di avere una funzione che restituisce entrambi i valori.