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

前端之家收集整理的这篇文章主要介绍了c – 为什么复制构造函数有时会被明确地声明为非内联?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我无法理解有关内联和客户二进制兼容性的句子.有人可以解释一下吗?

C FAQ Cline,Lomow:

When the compiler synthesizes the copy constructor,it makes them inline. If your classes are exposed to your customers ( for example,if your customers #include your header files rather than merely using an executable,built from your classes ),your inline code is copied into your customers executables. If your customers want to maintain binary compatibilty between releases of your header files,you must not change an inline functions that are visible to the customers. Because of this,you will want an explicit,non inline version of the copy constructor,that will be used directly by the customer.

解决方法

动态库(.dll,.so)的二进制兼容性通常很重要.

例如您不希望重新编译操作系统上的一半软件,因为您更新了一些低级库,所有内容都以不兼容的方式使用(并考虑安全更新的频率).即使你想要,你甚至可能都没有所需的所有源代码.

要使动态库的更新兼容,并且实际上有效,您基本上无法更改公共头文件中的任何内容,因为那里的所有内容都直接编译到其他二进制文件中(即使在C代码中,这通常也包括结构大小)和成员布局,显然你不能删除或更改任何函数声明).

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

猜你在找的C&C++相关文章