Thi*_*tio 3 c++ gcc clang compiler-optimization
我试图在使用关键字时获得预期的行为inline.我尝试在不同的文件中调用函数,模板化函数,使用内联函数的不同实现,但无论我做什么,编译器都不会内联函数.
那么在哪种情况下,编译器是否会选择在C++中内联函数?
这是我尝试过的代码:
inline auto Add(int i) -> int {
return i+1;
}
int main() {
Add(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我得到:
Add(int):
pushq %rbp
movq %rsp, %rbp
movl %edi, -4(%rbp)
movl -4(%rbp), %eax
addl $1, %eax
popq %rbp
ret
main:
pushq %rbp
movq %rsp, %rbp
movl $1, %edi
call Add(int)
movl $0, %eax
popq %rbp
ret
Run Code Online (Sandbox Code Playgroud)
或者,
template<typename T>
inline auto Add(const T &i) -> decltype(i+1) {
return i+1;
}
int main() {
Add(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到了:
main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl $1, -4(%rbp)
leaq -4(%rbp), %rax
movq %rax, %rdi
call decltype ({parm#1}+(1)) Add<int>(int const&)
movl $0, %eax
leave
ret
decltype ({parm#1}+(1)) Add<int>(int const&):
pushq %rbp
movq %rsp, %rbp
movq %rdi, -8(%rbp)
movq -8(%rbp), %rax
movl (%rax), %eax
addl $1, %eax
popq %rbp
ret
Run Code Online (Sandbox Code Playgroud)
我使用https://gcc.godbolt.org/来获取汇编代码,但我也尝试使用clang和gcc(有和没有优化选项).
编辑:
好的,我错过了优化选项.如果我将GCC设置为使用o3优化级别,则我的方法是内联的.
但仍然.GCC或其他编译器如何知道何时更好地内联函数?
作为一项规则,你的代码是始终只有在指定内联:
__attribute__((always_inline))
Run Code Online (Sandbox Code Playgroud)
例如(来自gcc文档):
inline void foo (const char) __attribute__((always_inline));
Run Code Online (Sandbox Code Playgroud)
虽然强制编译器内联代码几乎绝不是一个好主意.
您可以设置一个高优化级别(通过O标志)以实现最大内联,但有关更多详细信息,请参阅gcc文档
内联实际上由许多参数控制.您可以使用-finline-*选项设置它们.你可以看看他们在这里
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |