gpt4 book ai didi

c++ - static constexpr 的编译器优化

转载 作者:行者123 更新时间:2023-11-30 01:33:38 26 4
gpt4 key购买 nike

给定以下 C++ 代码:

#include <stdio.h>

static constexpr int x = 1;

void testfn() {
if (x == 2)
printf("This is test.\n");
}

int main() {
for (int a = 0; a < 10; a++)
testfn();
return 0;
}

Visual Studio 2019 生成以下调试构建程序集(使用已接受答案的方法 1 查看:How to view the assembly behind the code using Visual C++?)

int main() {
00EC1870 push ebp
00EC1871 mov ebp,esp
00EC1873 sub esp,0CCh
00EC1879 push ebx
00EC187A push esi
00EC187B push edi
00EC187C lea edi,[ebp-0CCh]
00EC1882 mov ecx,33h
00EC1887 mov eax,0CCCCCCCCh
00EC188C rep stos dword ptr es:[edi]
00EC188E mov ecx,offset _6D4A0457_how_compiler_treats_staticconstexpr@cpp (0ECC003h)
00EC1893 call @__CheckForDebuggerJustMyCode@4 (0EC120Dh)
for (int a = 0; a < 10; a++)
00EC1898 mov dword ptr [ebp-8],0
00EC189F jmp main+3Ah (0EC18AAh)
00EC18A1 mov eax,dword ptr [ebp-8]
00EC18A4 add eax,1
00EC18A7 mov dword ptr [ebp-8],eax
00EC18AA cmp dword ptr [ebp-8],0Ah
00EC18AE jge main+47h (0EC18B7h)
testfn();
00EC18B0 call testfn (0EC135Ch)
00EC18B5 jmp main+31h (0EC18A1h)
return 0;
00EC18B7 xor eax,eax
}

从程序集中可以看出,可能因为这是调试版本,所以对 for 有无意义的引用循环和 testfnmain .鉴于 printf,我希望他们根本不会在汇编代码中找到任何提及。在testfnstatic constexpr int x=1 以来永远不会被击中.

我有两个问题:

(1)也许在发布版本中,for循环被优化掉了。我怎样才能检查这个?即使使用在以下位置指定的方法 2,查看发布构建程序集代码对我也不起作用:How to view the assembly behind the code using Visual C++? .根本就没有产生汇编代码的文件。

(2)在使用static constexpr int/double/char而不是 #define的,在什么情况下可以保证前者不涉及任何不必要的开销(运行时计算/评估)? #define的,尽管饱受诟病,但似乎比 static constexpr 提供了更大的保证。在这方面。

最佳答案

这里的问题是您正在使用调试版本编译代码。如果您想在 asm 中保持理智,请改为编译为发布版。问题在于调试器用于帮助确认底层代码的逻辑。底层代码中的逻辑是它应该调用 testfn() 10 次。因此,您应该能够在该方法上放置一个断点,并在执行过程中将其击中正确的点。在发布版本中,该断点永远不会被击中(因为它会被优化掉)。

但是,在您的情况下,说 constexpr 被忽略是完全不正确的。您可能会注意到在生成的 asm 中没有对 printf() 的调用,因此编译器已正确识别出 if (x == 2) 永远不可能为真,并将其删除。但是,如果编译器完全删除了对 testfn() 的调用,您的断点将永远不会命中,调试器基本上就没有用了。

不要查看调试构建的输出并想象它告诉您有关代码或编译器的任何有用信息。您应该预料到代码会被故意取消优化。

关于c++ - static constexpr 的编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58178258/

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