gpt4 book ai didi

c++ - 纯功能,为什么没有优化?

转载 作者:行者123 更新时间:2023-12-02 09:50:20 24 4
gpt4 key购买 nike

我为这样的代码尝试了gcc(9.2.1)和clang(9.0.1)的最新版本:

//pure.cpp
int square (int x) __attribute__ ((pure));

int square (int x)
{
return x * x;
}

//test.cpp
#include <stdio.h>

int square (int x) __attribute__ ((pure));

int main(int argc, char *argv[])
{
const int same = argc;
printf("result: %d\n", square(same));
printf("result2: %d\n", square(same));
}

并像这样编译它:
g++ -ggdb -Ofast -c test.cpp
g++ -ggdb -Ofast -c pure.cpp
g++ -ggdb -Ofast -o test test.o pure.o

结果我看到:
    1043:       e8 58 01 00 00          callq  11a0 <_Z6squarei>
1048: 48 8d 3d b5 0f 00 00 lea 0xfb5(%rip),%rdi # 2004 <_IO_stdin_used+0x4>
104f: 89 c6 mov %eax,%esi
1051: 31 c0 xor %eax,%eax
1053: e8 d8 ff ff ff callq 1030 <printf@plt>
printf("result2: %d\n", square(same));
1058: 89 ef mov %ebp,%edi
105a: e8 41 01 00 00 callq 11a0 <_Z6squarei>
105f: 48 8d 3d aa 0f 00 00 lea 0xfaa(%rip),%rdi # 2010 <_IO_stdin_used+0x10>
1066: 89 c6 mov %eax,%esi
1068: 31 c0 xor %eax,%eax
106a: e8 c1 ff ff ff callq 1030 <printf@plt>

如您所见,有两次调用 _Z6squarei
但为什么?我将function标记为pure,并使用相同的参数,
为什么gcc和clang无法删除第二个调用?

最佳答案

问题是,虽然square()标记为纯,但printf()却不是。因此,在调用printf()之后,编译器不能随意假定所有状态都是相同的,因此square()本身可能读取不同的状态,从而产生不同的输出。但是,如果您两次调用square()而中间没有任何其他函数调用,那应该没问题:

int main(int argc, char *argv[])
{
const int same = argc;
int x = square(same);
int y = square(same);
printf("result: %d\n", x);
printf("result2: %d\n", y);
}

正如eerorika所提到的, __attribute__((const))将起作用,因为它增加了进一步的限制,即 square()除了其输入外可能不读取任何状态。有关pure和const之间的区别,请参见 this question

关于c++ - 纯功能,为什么没有优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60271031/

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