【发布时间】:2015-04-23 22:32:06
【问题描述】:
出于习惯,我经常为像这样的简单函数内联编写函数定义(人为的例子)
class PositiveInteger
{
private:
long long unsigned m_i;
public:
PositiveInteger (int i);
};
inline PositiveInteger :: PositiveInteger (int i)
: m_i (i)
{
if (i < 0)
throw "oops";
}
我通常喜欢将接口文件和实现文件分开,但这是我的习惯,对于那些我脑海中的声音告诉我的功能可能会在热点中受到很多打击。
我知道建议是“配置文件优先”,我同意,但如果我知道先验编译器会生成相同的最终目标代码,无论像这样的函数,我都可以避免大量的分析工作在编译或链接时内联。 (另外,我相信注入的分析代码本身会导致时序变化,从而淹没非常简单的函数(例如上面的函数)的效果。)
GCC 5.1 刚刚发布,宣传 LTO(链接时间优化)改进。他们真的有多好?知道最终的可执行文件不会受到影响,我可以安全地取消内联哪些类型的函数?
【问题讨论】:
-
那个代码格式……疼……眼睛。
PositiveInteger::PositiveInteger是事物的名称。它是合格的,但仍然只是一个名称。为什么要在里面放空格? -
我发现你写它的方式让 我的 眼睛很痛,尽管我知道到目前为止它更常见。与将空格放在其他任何地方的论点相同。