为什么复制构造函数有时会被明确地声明为非内联?

inf*_*ged 7 c++ copy-constructor

我无法理解有关内联和客户二进制兼容性的句子.有人可以解释一下吗?

C++ FAQ Cline,Lomow:

当编译器合成复制构造函数时,它会使它们内联.如果您的类暴露给您的客户(例如,如果您的客户#include您的头文件而不仅仅是使用从您的类构建的可执行文件),您的内联代码将被复制到您的客户可执行文件中.如果您的客户希望在头文件的版本之间保持二进制兼容性,则不得更改客户可见的内联函数.因此,您将需要一个明确的非内联版本的复制构造函数,该版本将由客户直接使用.

Fir*_*cer 2

.dll动态库( 、 )的二进制兼容性.so通常是一件重要的事情。

例如,您不想在操作系统上重新编译一半的软件,因为您更新了一些低级库,所有内容都以不兼容的方式使用(并考虑安全更新的频率)。通常,即使您愿意,您也可能没有这样做所需的所有源代码。

为了使动态库的更新兼容并真正产生效果,您基本上不能更改公共头文件中的任何内容,因为其中的所有内容都直接编译到其他二进制文件中(即使在 C 代码中,这通常可以包括结构大小)和成员布局,显然您也不能删除或更改任何函数声明)。

除了 C 问题之外,C++ 还引入了更多问题(虚函数的顺序、继承的工作原理等),因此可以想象,您可能会做一些更改自动生成的 C++ 构造函数、复制、析构函数等的操作,同时保持兼容性。如果它们与类/结构一起“内联”定义,而不是在源代码中显式定义,那么它们将直接被链接动态库并使用这些自动生成的函数的其他应用程序/库包含,并且它们不会得到您的更改版本(您可能甚至没有意识到已经更改!)。