【发布时间】:2019-08-06 03:49:12
【问题描述】:
首先声明,我知道inline 并不意味着编译器会一直内联函数...
在 C++ 中,非template 非constexpr 函数实现确实有两个地方可以使用:
- 一个标题,定义应该是内联的
- 源文件
将实现放在其中一个有好处/坏处:
-
inline函数定义- 编译器可以内联函数
- 由于必须解析定义和包含实现依赖项,编译器时间变慢。
- 同一站点上的多个用户之间的函数的多个副本
- 源文件定义
- 编译器永远不能内联函数(LTO 可能不是这样?)
- 如果文件没有改变,可以避免重新编译
- 每个站点一份
我正在编写一个可重用的数学库,其中内联可以显着提高速度。我现在只有测试代码和 sn-ps 可以使用,所以分析不是帮助我做出决定的选项。是否有任何规则——或者只是经验法则——决定在哪里定义函数?是否有某些类型的函数(例如具有异常的函数)总是会生成大量应该归类到源文件的代码?
【问题讨论】:
-
在您的代码工作之前,您正专注于微优化。首先让它工作,然后分析任何需要解决的热点。您不会解决任何担心是否建议对编译器进行内联而不是专注于以可维护的方式分解代码的问题。将代码分成函数的功能组(如果您的代码对于单个文件来说太长,则在单独的标头标头和源代码中)。让它工作,然后配置文件。无论您是内联还是创建单独的源都不会靠近您的主要问题区域。
-
@David 为什么你认为我的代码不起作用?
-
好吧,如果你有工作代码,同样适用。配置文件(您可以在建议内联和单独的来源之间移动),但是除了最罕见的情况外,在所有情况下产生可测量差异的可能性很小。担心您是内联还是拆分为单独的源的关键是您要担心的最后一个(如果有的话)考虑因素之一。我并不是要假设您的代码不起作用,但在要考虑的问题中没有提到任何代码。
-
@ktb :因为可以分析工作代码并且可以对替代方法进行基准测试。你没有在你的问题中证明任何这一点,因此假设。
-
在分析方面我只能做出这么多的假设。目前,我正在开发一个数学库,我面前没有所有潜在的用例,但我必须为最终用户做出决定。在我对向量进行操作的情况下,在一些明显的情况下内联非常重要。我主要是在为你不知道的时候投票的指导方针。
标签: c++