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

标签 c++

C++(和其他各种语言)支持内联函数。如果我想让一个函数内联,我必须在声明中使用 inline 关键字。对我来说,这个接缝很不直观:为什么我不能在调用函数时只使用 inline ?示例:

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

代替

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

这将允许我仅在特定位置内联该函数,而无需复制该函数。此外,每个函数都可以内联,这将使机制更加灵活。有没有不支持的原因?

最佳答案

前言:

内联函数内联内联扩展是一种优化,其中函数调用被重复的指令集替换.

声明一个内联函数就是向链接器声明该函数的处理方式与非内联函数不同。具体来说,单定义规则对于内联函数是不同的。允许在多个翻译单元中定义内联函数(实际上需要在使用该函数的所有翻译单元中定义)。这与非内联函数不同,非内联函数必须恰好在一个翻译单元中定义。 inline 关键字可用于声明内联函数。

虽然内联声明与内联优化的命名相似,而且前者可以间接影响后者是否可行,但这两个概念是分开的。

现在,答案。


If I want a function to be inlined, I have to use the inline keyword in the declaration.

您不一定非要使用内联关键字。如果函数是在同一翻译单元中定义的,则编译器可以将对非内联函数的调用扩展为内联。甚至这也不是查看所有翻译单元的链接时间优化器的要求。

例子:

// a.cpp
void foo(){}        // a non-inline function
inline void qux(){} // an inline function
void bar(){
    foo(); // this call to a non-inline function can be expanded inline
           // because the function is defined in the same TU
}

// b.cpp
void foo(); // the non-inline function must not be defined
            // in multiple translation units
inline void qux(){} // the inline function can and must be defined
                    // in both translation units
void xeb(){
    foo(); // this call to a non-inline function can not be expanded inline by
           // the compiler because the function is not defined in the same TU
           // the call can be expanded by a linker
    qux(); // this call can be expanded by the compiler
           // because the function is defined in the same TU
}

也就是说,链接时优化并不总是一个选项,并且函数调用确实发生在翻译单元之间,因此在某些情况下,内联定义确实是允许内联扩展所必需的。

一个迂腐的观点:一个函数可以在没有 inline 关键字的情况下声明为内联(如果它是一个成员函数)。

Why can't I just use inline when calling a function?

语言中没有这样的语法。

请注意,该函数仍然必须在同一个翻译单元中定义,否则它不能被编译器内联扩展。因此,如果您希望在多个翻译单元中进行内联扩展,该函数仍需要声明为内联。

我怀疑没有语法强制内联扩展的原因可能与无法选择 if 语句的哪个分支是“默认”分支的原因可能相同对性能有边际影响(在这两种情况下,推理只是我的猜测):众所周知,人类不擅长优化。我看不出为什么不能引入这种语言特性的技术原因。但我不希望这样的功能非常有用。

关于c++ - 为什么有内联函数声明而不是内联函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48423126/

相关文章:

c++ - boost make_shared 接受一个 const 引用。有什么办法可以解决这个问题?

c++ - eclipse CDT : force indexing conditionally compiled code

c++ - 访问使用 pinned_allocator 分配的 host_vector 项(推力库)

c++ - c++中的TRACE系统函数调用

c++ - 使用 Rabin Karp 进行模式搜索

c++ - 模拟 qobject_cast 失败

c++ - 在 C++ 中对 CreateFile 和 ReadFile 的异步调用

c++ - QWizard::addPage() 上的 "QObject::connect: Attempt to bind non-signal Class::signal"警告

c++ - 函数指针只在main内部起作用?

c++ - <chrono> 和 <ctime> 有什么区别?