为什么有时有时将复制构造函数声明为显式非内联的?

信息阻塞

我很难理解关于内联和客户二进制兼容性的句子。有人可以解释一下吗?

C ++常见问题解答Cline,Lowow:

当编译器合成副本构造函数时,它将使其内联。如果您的类向客户公开(例如,如果您的客户#包括您的头文件,而不是仅使用根据您的类构建的可执行文件),则将内联代码复制到客户的可执行文件中。如果客户希望在头文件的发行版之间保持二进制兼容性,则不得更改客户可见的内联函数。因此,您需要复制构造函数的显式非内联版本,该版本将直接由客户使用。

火枪手

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

例如,您不需要在OS上重新编译一半的软件,因为您以某种不兼容的方式更新了所有底层库(并考虑了安全更新的频率)。即使您愿意,通常您甚至可能甚至没有所需的全部源代码。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Scala 2.13中,为什么有时有时无法显式地召唤类型类?

为什么 Moq 有时需要在 Returns 中进行显式类型声明?

为什么在执行显式转换时转换构造函数需要声明复制构造函数?

当类被声明为包私有时,我们应该声明一个公共构造函数吗?

为什么.rstrip()有时有效,但有时却无效?

为什么有时有时需要手动重启路由器?

为什么有时有时无法编辑Google表格公式行距?

为什么有时有时可以从右边折叠无限个列表?

为什么有时有时首选关键代理而不是配置文件?

为什么有时有时需要手动导入密钥?

为什么我得到角色声明有时有命名空间有时没有命名空间

在Java中,为什么在创建新对象时有时将父类放在左侧?

给定的五个函数返回相同的输出有什么区别,特别是为什么有时有时它们不返回?

Python陈述式:有时为True,有时为False。为什么?

为什么这个 file_get_contents() 有时有效,有时无效?

为什么 console.log(undefined) 有时有效,但有时无效?

SQL Connect By Level 有时有效,有时不明白为什么

为什么TypeScript有时有时只将不可能的交集视为“从不”?

为什么函数有时返回0,有时返回false?

为什么此Powershell函数有时返回列表,而有时返回XmlElement?

在Ubuntu上,为什么有时有时会“ sudo apt-get”而有时却会“ sudo aptitude”?

Azure 函数应用 ETIMEDOUT 错误有时有效,但有时无效

为什么有时无法覆盖类函数?

为什么 sed 在替换时有时会截断?

为什么在熊猫中进行元素操作时有时需要添加.value?

为什么在Vue中使用$ refs时有时需要$ el?

为什么 HashSet 在依赖默认哈希和等于时有时不添加对象?

没有显式定义的构造函数时,为什么可以创建对象?

为什么在具有docker-compose的Docker容器中,Python进程的父pid有时有时为0?