11:18 pm
gcc заменяет printf с простой строкой на puts.
С -O2 выкидывает куски кода внутри 100%-ложных условий (if (0) {...}).
Круто, чо :-)
test.c:
#include <stdlib.h>
#include <stdio.h>
const int DEBUG = 0;
int main ( int argc, char *argv[] )
{
if (DEBUG) {
printf("Debug!\n");
}
return EXIT_SUCCESS;
}
gcc -save-temps test.c -o test: .file "test.c"
.globl DEBUG
.section .rodata
.align 4
.type DEBUG, @object
.size DEBUG, 4
DEBUG:
.zero 4
.LC0:
.string "Debug!"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $4, %esp
movl DEBUG, %eax
testl %eax, %eax
je .L2
subl $12, %esp
pushl $.LC0
call puts
addl $16, %esp
.L2:
movl $0, %eax
movl -4(%ebp), %ecx
leave
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.4.4"
.section .note.GNU-stack,"",@progbits
gcc -O2 -save-temps test.c -o test: .file "test.c"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
xorl %eax, %eax
popl %ebp
ret
.size main, .-main
.globl DEBUG
.section .rodata
.align 4
.type DEBUG, @object
.size DEBUG, 4
DEBUG:
.zero 4
.ident "GCC: (GNU) 4.4.4"
.section .note.GNU-stack,"",@progbits
| From: | ketmar |
Date: | December 1st, 2010 - 04:23 pm |
---|
| | | (Link) |
|
что, в принципе, совершенно неверно (я про замену функций). ибо меняет алгоритм (а кто ему сказал, что side effects у них одинаковые? да вообще, много возражений есть).
В общем случае — да.
Но здесь выводится строка с '\n' на конце.
puts именно это и делает.
Алсо, функции с побочными эффектами не нужны :-)
| From: | ketmar |
Date: | December 1st, 2010 - 05:13 pm |
---|
| | | (Link) |
|
помимо этого я могу и ещё довод привести. printf и puts вполне могут лежать в разных библиотеках (или puts быть макросом, например, который вызывает printf, хихикс). отсюда — ещё и непредсказуемость линковки.
понятно, что это, по факту, сейчас чуть ли не built-in компилятора сей, но всё равно — некультурно.
>Алсо, функции с побочными эффектами не нужны
согласен. тогда можно перестать тратиться на мониторы, клавиатуры, диски и прочую дребедень. купил кристалл, подал питание — и он что-то там внутри делает. бессмысленно, зато ни одной «грязной» функции не вызывает. %-)