我遇到了一位很棒的在线编辑器https://godbolt.org/ 显示代码的汇编版本。 我还阅读了有关C ++ 11的新功能的信息,并了解了constexpr。
看看下面的平方函数:
constexpr int square(int num) {
return num * num;
}
int main()
{
int result = square(2);
return 0;
}
以及为两个版本(constexpr和内联)生成的以下汇编代码
CONSTEXPR
main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 4
mov eax, 0
pop rbp
ret
INLINE
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版本中有一个函数调用代码?根据内联定义,应该避免吧?
答案 0 :(得分:1)
plus = incBy
函数不能保证在编译时执行,除非在需要恒定表达式的上下文中使用它们。将您的代码更改为
constexpr
,您会发现有所不同,因为int main()
{
constexpr int result = square(2);
return 0;
}
变量需要使用恒定表达式进行初始化。
请注意,优化级别也很重要。