我遇到了这个令人敬畏的在线编辑器https://godbolt.org/,它显示了代码的汇编版本。我还在阅读有关新的C ++ 11功能的文章,并了解了constexpr。
看看下面的方形函数:
constexpr int square(int num) {
return num * num;
}
int main()
{
int result = square(2);
return 0;
}
以及为两个版本生成的汇编代码(constexpr和inline)
constexpr
main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 4
mov eax, 0
pop rbp
ret
排队
square(int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], edi
mov eax, DWORD PTR [rbp-4]
imul eax, DWORD PTR [rbp-4]
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov edi, 2
call square(int)
mov DWORD PTR [rbp-4], eax
mov eax, 0
leave
ret
我到处都读到这样的函数可以内联,但为什么在asm版本中有一个函数调用代码?根据内联定义,应该避免对吗?
constexpr
函数不保证在编译时执行,除非它们在需要常量表达式的上下文中使用。将您的代码更改为
int main()
{
constexpr int result = square(2);
return 0;
}
你会看到差异,因为constexpr
变量需要用常量表达式初始化。
请注意,优化级别也很重要。