何时可以/将在C ++中内联函数?可以强制内联行为吗?

时间:2015-06-13 22:23:39

标签: c++ gcc clang compiler-optimization

当我使用关键字inline时,我试图获得预期的行为。 我试着在不同的文件中调用一个函数,模板化函数,使用内联函数的不同实现,但无论我做什么,编译器都不会内联函数。

那么在哪种情况下,编译器是否会选择在C ++中内联函数?

以下是我尝试的代码:

inline auto Add(int i) -> int {
  return i+1;
}

int main() {  
  Add(1);  
  return 0;
}

在这种情况下,我得到:

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

或者再次,

template<typename T>
inline auto Add(const T &i) -> decltype(i+1) {
  return i+1;
}

int main() {  
  Add(1);  
  return 0;
}

我得到了:

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

我使用https://gcc.godbolt.org/来获取汇编代码,但我也尝试使用clang和gcc(有和没有优化选项)在我的机器上。

修改

好的,我错过了优化选项。如果我将GCC设置为使用o3优化级别,我的方法是inlined

但是仍然。 GCC或其他编译器如何知道何时更好地内联函数?

2 个答案:

答案 0 :(得分:6)

通常,只有在您指定:

时,您的代码才会始终内联
__attribute__((always_inline))

例如(来自gcc文档):

inline void foo (const char) __attribute__((always_inline));

虽然强制编译器内联代码几乎绝不是一个好主意。

您可以设置一个高优化级别(通过O标志)以实现最大内联,但有关详细信息,请参阅gcc documentation

内联实际上由许多参数控制。您可以使用-finline- *选项设置它们。您可以查看它们here

答案 1 :(得分:0)

顺便说一下,你实际上没有声明一个函数。你声明了一个仿函数,一个可以被调用的对象,但也可以存储状态。而不是使用语法:
    内联自动添加(int i) - &gt; int {

你的意思是简单地说:
    inline int Add(int i){