C++ 静态意味着内联,反之亦然,或者两者兼而有之?

C++ 静态意味着内联,反之亦然,或者两者兼而有之?,c++,c++11,c++17,C++,C++11,C++17,对于免费(非类内)函数: 静态意味着内联 内联意味着静态 或者两者都有 考虑到以下例子: static void foo1() { ... }; static inline void foo2 { ... }; inline void foo3() { ... }; 有什么区别?不,内联并不意味着静态,反之亦然。参见NAD描述。 存在差异,考虑(在页眉中): 在2 cpp中,“void调用者[1-2]_-foo[1-3](){std::cout(S)Static告诉编译器代码仅从该模

对于免费(非类内)函数:

  • 静态
    意味着
    内联
  • 内联
    意味着
    静态
或者两者都有

考虑到以下例子:

static void foo1() {  ... };

static inline void foo2 { ... };

inline void foo3() { ... };

有什么区别?

不,内联并不意味着静态,反之亦然。参见NAD描述。

存在差异,考虑(在页眉中):

在2 cpp中,“
void调用者[1-2]_-foo[1-3](){std::cout(S)Static告诉编译器代码仅从该模块使用。如果不使用它,甚至可能会收到“unused”警告

(一) Inline告诉编译器要“更加努力地”内联代码。无论如何,这都不能保证,但编译器有各种选项和杂注来控制这一点

如果编译器决定将它内联到这个模块中,那么每个人都会很高兴。如果这个方法也在另一个(源)模块中使用,那么这个模块将自己决定做什么

(sI)如果编译器决定不内联非静态函数,那么它将作为独立函数存在

(SI)“static”的存在会产生影响。如果它是静态的,则该名称不会发送到链接器:另一个模块将生成另一个同名函数,可能来自同一源,也可能不是。如果它不是静态的,则编译器将向链接器发送符号。如果另一个模块也决定不内联,则它将被发送d两次,链接器只需选择一个即可处理此问题(对于动态链接,似乎是随机的)

(Si)使用静态复制可以改善代码局部性,非静态代码在除1次调用以外的所有调用中都会为非局部性付费。然而,非局部性并不是一个大问题。这也适用于编译器决定不内联的内联标记方法

(si)请注意,编译器决定以任何方式内联的非静态非内联函数必须作为非内联函数以及内联代码发送到链接器,以防其他模块应在其外部。如果未在外部引用(或导出),链接器可以丢弃此函数


它有很大区别吗?可能没有!

或者两者都没有,这就是答案。@cpplearner在类定义中定义任何成员函数都会使它隐式地
内联
。它是否是
静态
无关紧要。相反,
静态
成员函数意味着完全不同的东西,仍然是不相关的到“内联性”"对于成员函数。@user167921
您不能在成员函数上使用内联关键字
为什么不能?它似乎在我的编译器上工作。@UKMonkey-这是因为您的编译器必须接受有效的代码。是的,即使是
new
delete
。@Brian如果您支持假设它的实现在类之外,但在头文件中:
struct X{inline void doIt();};void X::doIt(){}
那么为什么会混淆呢?
static int foo1() { static int i = 0; return ++i; }
static inline int foo2() { static int i = 0; return ++i; }
inline int foo3() { static int i = 0; return ++i; }
int main()
{
    caller1_foo1(); // 1
    caller2_foo1(); // 1

    caller1_foo2(); // 1
    caller2_foo2(); // 1

    caller1_foo3(); // 1
    caller2_foo3(); // 2
}