gpt4 book ai didi

c - 了解 gcc 优化

转载 作者:行者123 更新时间:2023-11-30 19:53:44 48 4
gpt4 key购买 nike

我看到了一种令人费解的行为,我试图理解它......

示例代码..请忽略我正在返回局部变量地址的事实..

编辑:我只是使用此代码作为示例来了解 gcc 的优化行为。我不认为此示例代码中的未定义行为会改变 gcc 的优化逻辑。如果您认为确实如此,请解释一下。

    #include<stdio.h>
char *foo() {
char arr[] = "hello world is here..\n";
return arr;
}

int main() {
char *ptr;

ptr = foo();
printf("0x%x \n", ptr);
printf("%s", ptr);
}

在linux/x86机器上运行这个,main()中的第一个printf确实打印了一个地址..但第二个printf不打印任何东西。看起来 gcc 以某种方式优化了数组初始化。

如果我像下面这样改变 foo() ,那么字符串就会正确打印。我知道它是一个未定义的行为。但我只想了解这里的 gcc 优化。

    char *foo() {
char arr[] = "hello\n";
printf("0x%x\n", arr);
return arr;
}

在原始代码中,foo 怎么可能返回一个地址,但初始化却被优化掉了?这是汇编代码..我对 x86 汇编不太熟悉..gcc 在这两种情况下到底在做什么?

            .LC0:
.string "hello\n"
.text
.globl foo
.type foo, @function
foo:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl .LC0(%rip), %eax
movl %eax, -16(%rbp)
movzwl .LC0+4(%rip), %eax
movw %ax, -12(%rbp)
movzbl .LC0+6(%rip), %eax
movb %al, -10(%rbp)
leaq -16(%rbp), %rax
leave
ret
.LFE2:

以及 foo() 的汇编代码以及附加的 printf..

            .LC0:
.string "hello\n"
.LC1:
.string "0x%x\n"
.text
.globl foo
.type foo, @function
foo:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
subq $16, %rsp
.LCFI2:
movl .LC0(%rip), %eax
movl %eax, -16(%rbp)
movzwl .LC0+4(%rip), %eax
movw %ax, -12(%rbp)
movzbl .LC0+6(%rip), %eax
movb %al, -10(%rbp)
leaq -16(%rbp), %rsi
movl $.LC1, %edi
movl $0, %eax
call printf
leaq -16(%rbp), %rax
leave
ret

最佳答案

请忽略我正在返回局部变量地址的事实..

由于您还使用了函数返回的值,因此我们不能忽略这一点。 C 说你的程序调用了未定义的行为,并且实现有权做任何它想做的事情。

关于c - 了解 gcc 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10910164/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com