Игорь Пашев -

Nov. 29th, 2010

11:18 pm

Previous Entry Add to Memories Tell A Friend Next Entry

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

Tags: , , ,
(3 комментария | Оставить комментарий)

Comments:

[User Picture]
From:[info]ketmar
Date:December 1st, 2010 - 02:23 pm
(Link)
что, в принципе, совершенно неверно (я про замену функций). ибо меняет алгоритм (а кто ему сказал, что side effects у них одинаковые? да вообще, много возражений есть).
(Reply to this) (Thread)
[User Picture]
From:[info]igorpashev
Date:December 1st, 2010 - 03:06 pm
(Link)
В общем случае — да.

Но здесь выводится строка с '\n' на конце.
puts именно это и делает.

Алсо, функции с побочными эффектами не нужны :-)
(Reply to this) (Parent) (Thread)
[User Picture]
From:[info]ketmar
Date:December 1st, 2010 - 03:13 pm
(Link)
помимо этого я могу и ещё довод привести. printf и puts вполне могут лежать в разных библиотеках (или puts быть макросом, например, который вызывает printf, хихикс). отсюда — ещё и непредсказуемость линковки.

понятно, что это, по факту, сейчас чуть ли не built-in компилятора сей, но всё равно — некультурно.

>Алсо, функции с побочными эффектами не нужны
согласен. тогда можно перестать тратиться на мониторы, клавиатуры, диски и прочую дребедень. купил кристалл, подал питание — и он что-то там внутри делает. бессмысленно, зато ни одной «грязной» функции не вызывает. %-)
(Reply to this) (Parent)