L'assembly di lettura è utile per approfondimenti durante la scrittura di C / C ++? [chiuso]

-1

Anche se nella maggior parte dei casi non è necessariamente così, recentemente ho iniziato a leggere l'assembly generato del mio codice C ogni tanto, quando sono curioso dei tipi di ottimizzazioni che il mio compilatore sta facendo. Soprattutto per codice a basso livello o funzioni chiamate più volte.

Gli esempi includono:

  • Verifica se una modifica al codice C ha un impatto sul codice generato.
  • Controllare se la stessa espressione utilizzata due volte è ottimizzata in uno, o se assegnare una variabile fa la differenza.
  • Verifica le modifiche che potrebbero generare dimensioni del codice generate dal bloat.

Ora questo non è un metodo perfetto con qualsiasi mezzo, è possibile che alcune differenze nell'output generato siano un'arma rossa, a causa di tutti i tipi di logica interna e ampli; soglie all'interno del compilatore, ma è comunque interessante a volte.

A questo punto guardando l'assemblea posso cercare ogni comando, ma in realtà non leggere l'assembly (amd64 come accade) .

Quindi la mia domanda è: qualcuno ha trovato utile imparare una certa quantità di assembly per scrivere codice C migliore? (o almeno ottieni più informazioni sul loro codice).

  • Se sì, quanto è utile sapere?
  • Quali tipi di problemi ti ha aiutato a risolvere?

Nota, il pericolo è che uno scrive il codice C per l'assembly che è molto specifico per il proprio sistema di sviluppatori - qualsiasi vantaggio può essere perso su un compilatore o un'architettura diversi, tenendo conto che sono ancora interessato in altri sviluppatori esperienza

    
posta ideasman42 03.08.2014 - 16:07
fonte

2 risposte

3

A volte è necessario essere in grado di leggere alcuni assembly. Ad esempio quando si ottimizza il codice tramite la strumentazione del compilatore (si veda ad esempio qui ) . Uno ha bisogno di sapere quali sono i costi di type casting, allineamento dei dati e così via, avere per le prestazioni.

Inoltre, ci sono alcuni problemi come le convenzioni di chiamata a funzioni diverse (pascal vs stdcall) e altri problemi specifici del sistema che sono rilevanti. Ancora una volta, è utile capire cosa fa il compilatore, cosa forniscono le diverse tecnologie (SSE, AVX, ...) ed eseguire il debug di alcuni problemi bizzarri.

Una volta a conoscenza di tali problemi, scrivi un codice migliore:

  • consapevolezza del tipo di dati (ho bisogno di double / long, o è sufficiente con float / int)
  • evitando i cast non necessari

Di solito si evitano tali problemi definendo i propri tipi e attenendosi alle convenzioni. Aiuta il compilatore a fare un lavoro migliore, ed è anche più facile da capire / mantenere.

    
risposta data 03.08.2014 - 17:12
fonte
1

Non è sempre utile (ma a volte può essere d'aiuto) leggere il codice assembly generato. Piccolo consiglio quando si compila con GCC , compilare con

 g++ -Wall -fverbose-asm -O2 -S somesourcefile.cc

(il -fverbose-asm fornisce un codice assembly più leggibile)

Puoi anche guardare le rappresentazioni intermedie. Con g++ prova a passare -fdump-tree-all (con i tuoi flag di ottimizzazione). Attenzione, dà centinaia di file di dettagli.

A proposito, potresti trovare utile il mio plug-in GCC MELT

Infine, tieni presente che i compilatori generalmente ottimizzano meglio di quanto non facciano i programmatori umani.

    
risposta data 03.08.2014 - 16:52
fonte

Leggi altre domande sui tag