memcpy vs incarico in C
-
11-07-2019 - |
Domanda
In quali circostanze dovrei aspettarmi che memcpys superi le prestazioni dei moderni hardware INTEL / AMD? Sto usando GCC 4.2.x su una piattaforma Intel a 32 bit (ma sono interessato anche a 64 bit).
Soluzione
Non dovresti mai aspettarti che superino i compiti. Il motivo è che il compilatore utilizzerà comunque memcpy quando pensa che sarebbe più veloce (se si usano i flag di ottimizzazione). In caso contrario e se la struttura è abbastanza piccola da adattarsi ai registri, è possibile utilizzare la manipolazione diretta dei registri che non richiederebbe alcun accesso alla memoria.
GCC ha internamente speciali schemi di blocco dei blocchi che scoprono quando cambiare direttamente i registri / le celle di memoria o quando usare la funzione memcpy. Nota quando assegni la struttura, il compilatore sa al momento della compilazione quanto sarà grande la mossa, quindi può srotolare piccole copie (fare una mossa n-volte in fila invece che in loop) per esempio. Nota -mno-memcpy
:
-mmemcpy
-mno-memcpy
Force (do not force) the use of "memcpy()" for non-trivial block moves.
The default is -mno-memcpy, which allows GCC to inline most constant-sized copies.
Chi lo sa meglio quando usare memcpy del compilatore stesso?