C++ 发出内联函数

pio*_*kg2 4 c++

假设我有一个包含 function 的公共定义的库void foo();。库在内部调用此函数。为了获得最佳性能,我希望内联内部调用。我还想防止外部代码看到定义,以便稍后我可以在不破坏 ABI 的情况下更改实现。这是一段代码:

MyLib.h:

void foo();
Run Code Online (Sandbox Code Playgroud)

MyLibInlined.h:

inline void foo() { code here }
Run Code Online (Sandbox Code Playgroud)

MyLib.cpp

#define inline
#include "MyLibInlined.h"
Run Code Online (Sandbox Code Playgroud)

问题是它是否违反了 ODR 还是被认为是不好的做法?

编辑:foo如果是成员函数 怎么办?

Jon*_*ely 5

问题是它是否违反了 ODR 还是被认为是不好的做法?

它不会破坏 ODR,但它破坏了 [dcl.fct.spec] 中的规则:

如果具有外部链接的函数在一个翻译单元中被声明为内联,则该函数在其出现的所有翻译单元中也应被声明为内联;无需诊断。

相反,您应该拥有该函数的公共版本(未声明为内联),并且拥有在库中使用的内部版本:

// MyLibInlined.h
inline void foo_impl() { }
Run Code Online (Sandbox Code Playgroud)

然后在库内部定义foo为对内部库的调用:

// MyLib.cpp
#include "MyLibInlined.h"
void foo() { foo_impl(); }
Run Code Online (Sandbox Code Playgroud)

或者,如果所有调用都foo()在一个文件中,您根本不需要担心,只需将其定义为非内联函数,并让编译器将其内联到定义可见的文件中:

// MyLib.h
void foo();

// MyLib.cpp
void foo() { code here }
// use foo ...
Run Code Online (Sandbox Code Playgroud)

关键字inline并不意味着函数将被内联,它意味着定义是在标头中内联提供的。编译器不需要该关键字就能将其内联到定义它的文件中,因为它可以看到定义。您只需要inline关键字即可允许定义出现在多个翻译单元中,而不会导致多重定义错误。