2009-08-30 29 views
34

Estoy tratando de optimizar una gran cantidad de multiplicaciones y aritmética de puntero y me gustaría ver lo que hace el compilador cuando pongo indicadores de optimización.¿Cómo puedo ver el código ensamblador generado por un compilador gcc (cualquier sabor) para un programa C/C++?

--Edit--

Cómo restringirlo a una función específica o un bloque de código?

--Edit_2--

Cómo vamos gcc generar un conjunto de código menos detallado?

+2

¿Un ensamblaje menos detallado? ¿Qué quieres decir con eso exactamente? –

+0

un código de ensamblaje. En otras palabras, no quiero cosas extremas como inicializaciones de registros de activación, sino solo el código relacionado con mis estados. espero que lo aclare. – vehomzzz

+1

por lo que desea que gcc genere el código de ensamblado _incorrect_, que solo satisfaga su belleza? No señor. –

Respuesta

35

Agregue -S cambie a su línea de comando.

Editar: No olvide que colocará el conjunto en los archivos que especificó en el interruptor -o.

+0

Puede usar 'gcc -O3 -march = native foo.c -S -o- | less' para conectar a 'less' en lugar de crear un archivo' .s'. Consulte también [¿Cómo eliminar el "ruido" de la salida de ensamblaje de GCC/clang?] (Https://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-output) para obtener más información consejos sobre cómo ver la "parte interesante" de la salida del asm, especialmente ** la charla de CppCon2017 de Matt Godbolt: ["¿Qué ha hecho mi compilador últimamente? Desatornillar la tapa del compilador "] (https://youtu.be/bSkpMdDe4g4) ** –

9

¿Cómo restringirlo a una función específica o un bloque de código?

Ponga esa función en un archivo fuente separado (y use un parámetro de línea de comando diferente para ese archivo fuente).

+1

Eso es lo que he estado haciendo. Tengo curiosidad si es posible solo de opciones. – vehomzzz

+0

Esto puede no reflejar la forma en que realmente se optimiza si puede alinearse con los llamantes. (Especialmente con la optimización del tiempo de enlace).Tener incluso un parámetro sea una constante en tiempo de compilación puede marcar una gran diferencia, o tener la alineación o el tamaño de una matriz conocida puede cambiar mucho la auto-vectorización. Pero sí, esto es bueno * si * entiendes lo que estás haciendo. –

2

Puede detener su programa en un punto de interrupción en el depurador de Visual Studio y hacer "mostrar el ensamblaje" e incluso recorrerlo una instrucción a la vez.

+3

¿Por qué se rechazó esta respuesta? Es una respuesta perfectamente válida. – aaronsnoswell

+1

@aaronsnoswell No lo hice, pero presumiblemente porque la pregunta es explícita sobre GCC. – delicateLatticeworkFever

4

También podría ejecutar ese programa en un depurador como gdb y usar una vista de desensamblaje. En gdb, puede usar el comando disass/m para ver el ensamblaje mezclado con el código C en la ubicación actual.

+0

¿Puedes agregar un ejemplo mínimo? 'disass/m' solo imprime' No frame selected' –

Cuestiones relacionadas