为什么存在内联函数声明而不是内联函数调用?

11 浏览
0 Comments

为什么存在内联函数声明而不是内联函数调用?

C++(以及其他各种语言)支持内联函数。如果我想要一个函数被内联,我必须在声明中使用inline关键字。对我来说,这似乎相当不直观:为什么我不能在调用函数时只使用inline呢?例如:

void foo(){...}
inline foo();

而不是

inline void foo(...){...}
foo();

这样我就可以在特定的位置内联函数,而无需复制函数。此外,每个函数都可以被内联,这将使机制更加灵活。是否有原因不支持这种方式?

0
0 Comments

为什么会出现内联函数声明而不是内联函数调用?

在C++中,内联函数是一种优化技术,通过将函数调用替换为一组重复的指令来进行内联。使用内联函数声明是为了告诉链接器,该函数与非内联函数有所不同,特别是内联函数的一致性规则与非内联函数不同。内联函数允许在多个编译单元中定义(实际上,必须在使用该函数的所有编译单元中定义)。这与非内联函数不同,非内联函数必须在精确的一个编译单元中定义。使用inline关键字可以声明一个内联函数。

虽然内联声明与内联优化命名类似,并且前者间接影响后者是否可行,但这两个概念是不同的。

为什么不能直接在调用函数时使用内联关键字?

语言中就是没有这样的语法。

注意,即使函数在同一个编译单元中定义,函数调用也必须被声明为内联才能够被编译器内联展开。因此,如果希望在多个编译单元中进行内联展开,函数仍然需要声明为内联。

为什么会出现内联函数声明而不是内联函数调用?

在C++中,内联函数是一种优化技术,通过将函数调用替换为一组重复的指令来进行内联。使用内联函数声明是为了告诉链接器,该函数与非内联函数有所不同,特别是内联函数的一致性规则与非内联函数不同。内联函数允许在多个编译单元中定义(实际上,必须在使用该函数的所有编译单元中定义)。这与非内联函数不同,非内联函数必须在精确的一个编译单元中定义。使用inline关键字可以声明一个内联函数。

虽然内联声明与内联优化命名类似,并且前者间接影响后者是否可行,但这两个概念是不同的。

在C++中,内联函数是一种优化技术,通过将函数调用替换为一组重复的指令来进行内联。使用内联函数声明是为了告诉链接器,该函数与非内联函数有所不同,特别是内联函数的一致性规则与非内联函数不同。内联函数允许在多个编译单元中定义(实际上,必须在使用该函数的所有编译单元中定义)。这与非内联函数不同,非内联函数必须在精确的一个编译单元中定义。使用inline关键字可以声明一个内联函数。

虽然内联声明与内联优化命名类似,并且前者间接影响后者是否可行,但这两个概念是不同的。

虽然内联声明与内联优化命名类似,并且前者间接影响后者是否可行,但这两个概念是不同的。

你不一定需要使用内联关键字。如果函数在同一个编译单元中定义,编译器可以在函数调用处展开非内联函数。即使对于链接时优化器来说,这也不是一个要求,因为它可以看到所有的编译单元。

然而,并不总是可以使用链接时优化,函数调用确实会发生在不同的编译单元之间,因此在某些情况下,确实需要使用内联定义来允许内联展开。

需要注意的是,成员函数可以在没有内联关键字的情况下声明为内联。

为什么在调用函数时不能直接使用内联关键字?

语言中就是没有这样的语法。

需要注意的是,即使函数在同一个编译单元中定义,函数调用也必须声明为内联才能够被编译器内联展开。因此,如果希望在多个编译单元中进行内联展开,函数仍然需要声明为内联。

我怀疑之所以没有语法来强制内联展开的原因可能与为什么没有办法选择if语句的“默认”分支(这可能会对性能产生微小的影响)的原因相同(这只是我的猜测):人类在优化方面非常糟糕。我认为技术上没有理由不能引入这样的语言特性。但是我不认为这样的特性会非常有用。

0
0 Comments

在C++中,使用`inline`关键字并不意味着函数调用会被内联。它的意思是定义可以出现在多个翻译单元中,而通常只允许一个定义。

由于头文件通常会被包含在C++程序的许多翻译单元中,头文件中的任何函数定义都会出现在多个翻译单元中。所以,为了使其工作,你需要对这些定义使用`inline`关键字。虽然这仍然与内联有关,因为在这种情况下(定义位于头文件中),定义在包含头文件的所有调用点都是可用的,允许编译器内联它,因为它知道完整的定义。如果头文件中只有一个声明可用,内联只能在链接时进行(使用'link time optimization',也称为LTO)。

“does not mean that the calls should get inlined”是什么意思?

这意味着这个关键字并不是将函数体替换为函数调用的位置。

但是根据定义,它只是对编译器的建议。如果你错过了我的观点,这是一个建议而已。在这里阅读第一个注意事项:en.cppreference.com/w/cpp/language/inline

但它不再是一个建议。你不会有反效果的,希望你能理解。最后的话留给你... 🙂

`inline`关键字的文档介绍强调了隐式内联函数,所以不再是建议了。

0
0 Comments

为什么会有内联函数声明而不是内联函数调用?

简短而简洁的答案是:“内联”不再具有过去的意义。现在,它只是意味着链接器应该忽略来自不同编译单元的多个定义,并且只选择一个并继续进行。编译器有自由进行任何操作。大多数现代编译器都会忽略“内联”。

额外的事实是:在最新和最伟大的C++中,你可以将变量声明为内联。

在程序中可能会有多个内联函数或变量的定义(自C++17起),只要每个定义出现在不同的翻译单元中。

我认为这就是我所说的,“链接器应该忽略来自不同编译单元的多个定义。”只选择一个.. 这似乎意味着其他的不会被内联

外表可能会欺骗人。:-) 链接器不知道编译器是否在给定的编译单元中内联展开了一个函数,或者根本没有看到它。

0