当方法体位于头文件中时强制内联
Is inline forced when method body is in header file?
我知道inline
关键字只是对编译器的一个提示,而不是强制的(除非在MSVC中使用__forceinline)。
在header中声明内联函数也是这样吗?编译器将把代码放在哪个编译单元?
inline
不仅仅是对编译器的一个提示。
一个内联函数可以在多个翻译单元中定义,所有这些定义将具有相同的类型、地址和定义。
如果一个函数是在头文件中定义的,那么它必须声明为inline
,否则当它被包含在多个翻译单元中时,它将违反一个定义规则。
内联函数是:
- 全局作用域的函数可以使用关键字
inline
内联声明。 - 完全在
class
/struct
/union
定义内定义的函数,无论它是成员函数还是非成员友元函数,都始终是内联的。 - 声明为
constexpr
的函数总是内联的。
(源)
在header中声明内联函数时也是[inline
是提示]的情况吗?
是的。inline
关键字总是提示编译器执行"内联"。
但是,请注意这只是一个提示。编译器可以自由地忽略它(很多编译器都是这样做的)。
编译器能够对内联函数执行内联的真正原因是整个定义是可用的。您将注意到static
函数和实例化函数模板的内联。
编译器将把代码放在哪个编译单元?
在链接之前,内联函数将在定义它的任何编译单元中被完全定义。它将被完整地编译到每个目标文件中。
在链接过程中,链接器将决定使用哪个定义,并丢弃所有其他定义。
参见此问题及其答案
该代码将出现在所有包含该头文件的编译单元中。inline
的要点是告诉链接器这个函数可以在多个目标文件中找到,并且链接器可以选择这些副本中的任何一个。
内联不是强制的。如果在类定义中定义方法,则该方法是隐式内联的。它就像在类定义之外定义它,只是隐含了内联。这与定义在哪个文件中无关。
当您请求内联的函数实际上没有内联时,由编译器决定将其放在何处。在早期,您可以在包含头文件的每个文件中获得非导出副本。现在,应用了一些策略,比如将它放在与第一个构造函数、第一个方法或虚函数表相同的位置。compiler-dependent。
相关文章:
- 如何使用curlpp通过POST方法上传文件和json数据
- 一种在C++中读取TXT配置文件的简单方法
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 在C++中包含原型文件的正确方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 不带预处理器的调用方法/文件的文件名/行号
- 引用文件的适当方法是什么?
- 在文件中写入而不是在 c++ 中使用 "<<" 的替代方法?
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 创建进行生产构建并创建调试信息的C++生成文件的最佳方法?
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)
- 将位字符串转储到二进制文件的最佳方法是什么
- 在目录中查找所有.cpp.h文件(include,src等)的传统方法
- 是在DEX文件方法计数中计数的本机C 方法
- C++更新 txt 文件方法
- h头文件方法混乱