对函数有什么要求,以便可以在c ++中内联执行?是否存在函数不能内联的情况?或者任何函数可以是内联的,程序员有责任根据运行时和编译时考虑来决定如何定义函数?
有一个包含private成员函数的类,我想标记为inline(以明确标记我暗示特定函数可能被内联的意图),但不要将它们的实现公开给 API 使用者。为简单起见,它可能如下所示:
Airplane.h:class Airplane
{
char manufacturer[80];
char mode[80];
// ...
public:
void autopilot_steer_left(int degree);
// ...
private:
// ...
inline bool validate_hydraulic_on_left_wing(); // secret, patent-based, etc.
};
Run Code Online (Sandbox Code Playgroud)
Airplane.cpp:#include "Airplane.h"
// ...
void Airplane::autopilot_steer_left(int degree)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
我应该把定义放在哪里Airplane::validate_hydraulic_on_left_wing?我知道常见的地方是Airplane.h(可能在课堂内,所以它是inline隐含的),但这与我的意图相矛盾。
!特定于常用的方法,如getter和setter.!
我不知道何时inline应该使用关键字.我知道它的作用,但我仍然不知道.
根据Bjarne Stroustrup的采访,他说:
我自己的经验法则是使用内联(显式或隐式)仅用于我知道经常使用的简单的单行或双行函数,并且多年来不太可能发生太大变化.就像vector的size()函数一样.内联的最佳用途是函数,其中body的代码少于函数调用和返回机制,因此内联函数不仅比非内联版本更快,而且在对象内核中更紧凑:更小更快.
但是我经常读到编译器会自动内联短函数,比如getter,setter方法(在这种情况下得到的size()是a vector).
有人可以帮忙吗?
编辑:
多年来回到这一点并且更多地体验高性能C++ +编程,内联确实可以提供帮助.在游戏行业工作甚至强制在线有时会有所作为,因为并非所有编译器都能正常工作.有些可能会自动内联,有些则不会.我的建议是,如果您使用框架,库或任何使用频繁的代码考虑使用内联,但这只是一般建议,因为您希望这些代码完全针对任何编译器进行优化.始终使用内联可能不是最好的,因为您还需要这部分代码的类定义.如果您不能再使用前向声明,有时这会增加编译时间.
另一个提示:即使分离了函数定义,你也可以使用C++ 14自动返回类型推导:
MyClass.h
class MyClass
{
int myint;
public:
auto GetInt() const;
}
inline auto MyClass::GetInt() const { return myint; }
Run Code Online (Sandbox Code Playgroud)
所有在.h文件中.
我在很多地方读到过,__device__函数几乎总是由 CUDA 编译器内联。__device__那么,当我将代码从内核移动到内核调用的函数时,(通常)使用的寄存器数量不会增加,这样说是否正确?
例如,以下代码片段使用相同数量的寄存器吗?他们的效率相同吗?
片段 1
__global__ void manuallyInlined(float *A,float *B,float *C,float *D,float *E) {
// code that manipulates A,B,C,D and E
}
Run Code Online (Sandbox Code Playgroud)
片段2
__device__ void fn(float *A,float *B,float *C,float *D,float *E) {
// code that manipulates A,B,C,D and E
}
__global__ void manuallyInlined(float *A,float *B,float *C,float *D,float *E) {
fn(A,B,C,D,E);
}
Run Code Online (Sandbox Code Playgroud) 我搜索了一些相关的问题(例如C++中的内联函数的好处?),但我仍有疑问.
如果内联函数只是"为编译器提供一个简单的机制来应用更多的OPTIMIZATIONS".
由于内联函数将替换代码中的实际调用,因此将内联函数作为const调用有什么用。
Inline void adddata() const {...}
Run Code Online (Sandbox Code Playgroud)