gpt4 book ai didi

c++ - 激励 'inline' 说明符的真实世界示例?

转载 作者:行者123 更新时间:2023-12-01 14:42:27 25 4
gpt4 key购买 nike

背景:C++ inline 关键字不能确定函数是否应该被内联。
相反,内联允许您提供单个函数或变量的多个定义,只要每个定义出现在不同的翻译单元中。
基本上,这允许在头文件中定义全局变量和函数。
是否有一些示例说明我为什么要在头文件中编写定义?
我听说可能有模板示例无法将定义写入单独的 cpp 文件中。
我听说过其他关于性能的说法。但这是真的吗?因为据我所知,使用 inline 关键字并不能保证函数调用是内联的(反之亦然)。
我有一种感觉,这个特性可能主要由试图编写古怪和高度优化的实现的库编写者使用。但是有一些例子吗?

最佳答案

它实际上很简单:当您想在头文件中编写(函数或变量(自 c++17 起)的定义)时,您需要内联。否则你会违反 odr只要您的标题包含在超过 1 个 tu 中.就是这样。这里的所有都是它的。
值得注意的是,一些实体被隐式声明为内联,例如:

  • 在类的主体内定义的方法
  • 模板函数和变量
  • constexpr 函数和变量

  • 现在问题变成了为什么以及何时有人想要在头文件中编写定义,而不是将头文件中的声明和源代码文件中的定义分开。这种方法有优点也有缺点。以下是一些需要考虑的因素:
    优化
    在源文件中有定义意味着函数的代码被烘焙到 tu 二进制文件中。它不能在定义它的 tu 之外的调用站点内联。将它放在头文件中意味着编译器可以在它认为合适的任何地方内联它。或者它可以根据调用它的上下文为函数生成不同的代码。 lto 也可以达到同样的效果在可执行文件或库中,但对于库,启用此优化的唯一选项是在 header 中包含定义。
    图书馆分布
    除了在库中启用更多优化之外,拥有仅 header 库(如果可能)意味着分发该库的更简单方法。用户所要做的就是下载 headers 文件夹并将其添加到他/她的项目的包含路径中。在非 header 库的情况下,事情变得更加复杂。因为您不能混合和匹配由不同编译器甚至由相同编译器编译但具有不同标志的二进制文件。因此,您要么必须分发带有完整源代码的库以及构建工具,要么必须以多种格式编译库(cpu 架构/OS/编译器/编译器标志组合)
    人类偏好
    一些人(包括我)认为必须编写一次代码是一个优势:无论是从代码文档的角度还是从维护的角度。其他人认为将声明与定义分开会更好。一个论点是它实现了接口(interface)与实现的分离,但事实并非如此:在 header 中,您需要有私有(private)成员声明,​​即使它们不是接口(interface)的一部分。
    编译时性能
    将所有代码放在 header 中意味着在每个 tu 中都复制它。当涉及到编译时间时,这是一个真正的问题。重头 C++ 项目因编译时间慢而臭名昭著。这也意味着函数定义的修改将触发包含它的所有 tu 的重新编译,而在源代码中定义的情况下只有 1 个 tu。 Precompiled headers尝试解决这个问题,但解决方案不可移植并且有自己的问题。

    关于c++ - 激励 'inline' 说明符的真实世界示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62927939/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com