【发布时间】:2015-05-25 23:25:44
【问题描述】:
C++ 中的inline 关键字允许在头文件中定义函数,以便编译器可以实际内联它们或只保留函数的一份副本。这允许通过直接在头文件中定义函数来减少编译单元的数量,其优势通常是编译时间快几倍,执行速度可能更快。
为什么不能将相同的模式应用于命名空间范围的变量,而 C++ 中的函数在将它们视为特殊指针时实际上是命名空间范围的变量?
我能想到的是使用内联函数的静态局部变量。
inline std::string& Hello__() { //Edit: Added the &
static std::string hello("Hello");
return hello;
}
#define Hello (Hello__())
编辑:我想澄清我的问题如下。
我使用术语“内联”作为编译器的理解。它允许具有相同名称的相同定义在多个编译单元中,允许在标题中定义。 “内联”的主要优点不是宏函数所具有的性能优势,而是由于减少了编译单元数量而缩短了编译时间。它可能会短几倍。
我确实提出了一个让变量像内联函数一样工作的解决方案。但我仍在寻找更好的方法来做到这一点。
再次明确说明,我想要实现的是在头文件中定义一个命名空间范围的变量,就像一个内联函数,以使构建过程尽可能简单和快速。
Edit2:感谢 dyp 评论中的 link。我刚刚阅读了提案,这正是我的想法。该提案的当前状态如何?
引自提案:
然而,渴望存在 全局唯一对象,无需选择单个翻译 定义它的单位。作为一个实际问题,做出这个选择 通常需要使用非平凡的预处理器宏, 单独编译的库,或两者兼而有之。然而,C++ 的一大优势 是它支持开发headeronly库的能力。在 这种静脉,缺乏定义内联变量姿势的能力 对库设计的重大限制。
【问题讨论】:
-
我看到了您提出的解决方案,但您要解决的问题是什么?
-
@xiver77:函数可以内联,因为它们是不可变的。在您的示例中,
hello是可变的,因此它的值必须在使用它的地方之间共享(以便一个地方的更改对其他地方可见)。 -
老实说,黄色引号方块有一个很好的观点,我也希望看到解决。在使用静态变量声明类时,这将有助于提高凝聚力。不必选择一个 .cpp 来帮助可怜的小链接器。这里的 inline 表示
coalesce definition。 -
我完全赞成。我最近尝试使用 wxWidgets 的一些仅标题部分,但由于引用了
wxString::npos,它无法链接。在包含该定义的库中进行链接将我的可执行文件大小增加了 25MB;我最终把我自己的定义放了进去!如果npos不需要链接特定的定义,那就太好了。
标签: c++ inline language-lawyer