"La confusione del linguaggio di programmazione C ++" sul confronto

6

Non sto cogliendo l'idea da questa citazione di Stroustrup alla pagina 862 della "4 ° edizione del linguaggio di programmazione C ++" alla fine del primo paragrafo (ho evidenziato la parte pertinente):

Building the comparison criteria into a sort function is unacceptable because the same data can be sorted according to different criteria. This is why the C standard-library qsort() takes a comparison function as an argument rather than relying on something fixed, say, the < operator.

On the other hand, the overhead imposed by a function call for each comparison compromises qsort() as a building block for further library building. For almost every data type, it is easy to do a comparison without imposing the overhead of a function call.

Is that overhead serious? In most cases, probably not. However, the function call overhead can dominate the execution time for some algorithms and cause users to seek alternatives.

Che cos'è un esempio di confronto che non è una funzione?
Perché fornire un confronto tra template e un algoritmo di stl come std::sort potrebbe direttamente confrontare invece di richiamare una chiamata di funzione?

    
posta lostdong12 20.10.2017 - 01:24
fonte

1 risposta

15

È un piccolo difficile essere certi quando si prende una citazione così breve dal contesto, ma presumo che stia puntando sul fatto che i confronti di oggetti semplici normalmente non comportano alcun chiamate di funzione.

Ad esempio, considera il codice come:

std::vector<int> a { 19, 7, 1, 144, 14, 10, 5};

std::sort(a.begin(), a.end());

In questo caso, il codice per confrontare un int con un altro verrà normalmente generato in linea, eliminando il sovraccarico di chiamare una funzione per confrontare i numeri. Da un punto di vista sintattico, ciò che viene utilizzato è una funzione istanziata da un modello di funzione ( std::less<T> , per essere precisi). Tuttavia, quando guardi il codice generato, il piccolo bit di codice per std::less<T> verrà normalmente generato in linea, quindi non c'è alcuna funzione chiamata overhead.

Questo è un deciso contrasto con (per un ovvio confronto) qsort dalla libreria standard C. Ha il codice oggetto generato per qsort stesso nella libreria standard e quel codice viene scritto per invocare il confronto tramite un puntatore a una funzione. Se si desidera generare il codice inline per questo caso, dovrebbe essere costruito come ottimizzazione link-time (non in fase di compilazione).

Questa è (la maggior parte di?) perché usare std::sort (come sopra) sarà in genere sostanzialmente più veloce dell'utilizzo di qsort , specialmente quando si tratta di tipi che sono davvero semplici da confrontare, come int s usato Qui. In questo caso, puoi aspettarti che std::sort sia circa tre volte più veloce di qsort .

    
risposta data 20.10.2017 - 02:00
fonte

Leggi altre domande sui tag