Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 默认构造函数和析构函数是否内联?_C++_C_Inline_Binary Compatibility_Abi - Fatal编程技术网

C++ 默认构造函数和析构函数是否内联?

C++ 默认构造函数和析构函数是否内联?,c++,c,inline,binary-compatibility,abi,C++,C,Inline,Binary Compatibility,Abi,我很好奇编译器生成的默认构造函数和析构函数是内联的还是非内联的,因为我可以用任何一种方式证明它是正确的。一方面,您希望默认构造函数/析构函数不内联,以便以后添加它们不会破坏ABI(因为只有默认值时编译的对象文件将内联生成的定义,而不是您定义的定义)。另一方面,对于C++编译器,编译C代码既执行又编译C编译器,则不能为每个分配的结构添加构造函数/析构函数调用,而C++中,类与结构之间的唯一功能差异应该是默认访问保护。也许链接器以某种方式解决了这个问题?也许不同编译器的答案不同 这个问题的结果:如果

我很好奇编译器生成的默认构造函数和析构函数是内联的还是非内联的,因为我可以用任何一种方式证明它是正确的。一方面,您希望默认构造函数/析构函数不内联,以便以后添加它们不会破坏ABI(因为只有默认值时编译的对象文件将内联生成的定义,而不是您定义的定义)。另一方面,对于C++编译器,编译C代码既执行又编译C编译器,则不能为每个分配的结构添加构造函数/析构函数调用,而C++中,类与结构之间的唯一功能差异应该是默认访问保护。也许链接器以某种方式解决了这个问题?也许不同编译器的答案不同

这个问题的结果:如果C++中有一个POD结构,我可以在某些编译器中通过定义空内嵌构造函数/析构函数来代替默认值吗?

如果C++中有POD结构,我可以在某些编译器中通过定义空内嵌构造函数/析构函数来代替默认值吗?


理论上,是的!任何函数(包括构造函数和析构函数)都可以内联声明,将函数体放在类定义中是一种方法。但是,如果它实际上是内联函数,那么就取决于编译器。

< P> C++标准称,在<强> 12.1 [类cTor ] / 5 < /强> < /P>中。 隐式声明的默认构造函数是其类的内联公共成员

12.4[class.dtor]/3中

隐式声明的 析构函数是其类的内联公共成员


它在不同的编译器中有所不同,但总的来说:是的,它们应该这样做


至少使用gcc,您可以生成一个内联函数和一个外联函数。离线版本被标记为“链接一次”,因此无论有多少对象生成默认构造函数,链接输出中最多只会有一个版本。如果事实上没有人不恰当地使用默认构造函数,那么链接输出中根本就不包含它,而且实际上是一个纯内联函数。

这并没有解决我的问题。我在问默认编译器生成的构造函数/析构函数是否是内联的。@约瑟夫·加文:我相信这会因编译器而异,它对您编写实现的方式有何影响?@Als:我对我的问题进行了编辑,以便在底部包含一种可能很重要的方式。@约瑟夫·加文:重点是“是内联的”在这种情况下是没有意义的。应用于函数的
inline
关键字并不保证函数将被内联,并且没有
inline
标记(无论是显式使用关键字还是隐式使用关键字)也不会阻止函数被内联。这只是一个暗示。@Karl:一般来说,这是一个好的观点-+1ed-但我认为这并不完全正确。。。例如,编译到共享库中的越界函数在编译或链接期间不能由该共享库之外的客户端代码内联,否则更改共享库不会可靠地改变实现。为了确保这一点,内联通常不跨越翻译单元边界直到链接时间,然后只有静态链接的对象才可以考虑这样的内联…从工具的角度来看-执行它是一段痛苦的时间。
结构
关键字之间的区别是不应该存在的。@Luc:假设在某种意义上,我可以看到编译器不符合标准。不,标准要求它们是内联的。@Gene,不,标准要求它们是
内联的
,这不是同一件事。我认为这与
内联的
关键字的意思大致相同-编译器可以自由行使自己的判断,如果构造函数过大,则不需要实际内联构造函数。。。“这也是你的理解吗?”托尼,我想是的。7.1.2/2自引用地说,“不需要实现在调用点执行此内联替换;但是,即使省略此内联替换,也应遵守7.1.2中定义的内联函数的其他规则”