“内联”课程的处罚

时间:2010-04-07 19:36:42

标签: c++ visual-studio class

Visual Studio允许您创建“内联”类(如果我没有弄错名称)。 所以类头和实现都在一个文件中。

小时。 file包含类和函数的定义和声明,根本没有.cpp文件。

所以我想知道这样做是否有任何惩罚?任何缺点?

非常感谢

7 个答案:

答案 0 :(得分:8)

  这样做会有什么惩罚吗?任何缺点?

是。如果您需要更改类的实现,因为这是在头文件中,该类的所有用户都需要重新编译,即使他们只应该关注接口。对于某些项目,这可能非常昂贵。

答案 1 :(得分:2)

您可以使用任何编译器将类的完整实现放在标头中。编译时通常会受到惩罚 - 标题将针对包含它的每个源文件单独编译。

在代码膨胀方面可能也会受到惩罚 - 将函数定义放在类定义中隐式声明它们是内联的,因此编译器可能会增加编译器为每个函数生成代码的可能性,而不是生成代码在一个地方,并在其他地方生成调用。

答案 2 :(得分:1)

如果你问我一个非常糟糕的主意,特别是对于大型项目。看看Lakos的“大规模C ++软件设计”,了解这种方法的缺点。

答案 3 :(得分:1)

还有另一种可能的惩罚:表现。 如果内联函数太多,这会导致代码膨胀,导致函数和循环可能无法放入目标CPU的指令缓存中的可执行文件。

答案 4 :(得分:0)

没有罚款 但这并不意味着代码实际上是内联的。

他们的inline关键字只是一个通常被忽略的编译器提示,因为在知道何时内联代码方面,编译器通常比开发人员更聪明。

答案 5 :(得分:0)

inline关键字只是编译器内联代码的提示。 Visual Studio有一个__forceinline说明符,用于使编译器在没有成本/收益分析的情况下强制内联函数。

关于__forceinline:http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx

除了大文件的编译时间之外,具有所有定义和声明的* .h文件不应该有任何区别。

答案 6 :(得分:0)

有两个“处罚”

  • 将在编译时评估一个。如果你有一个异常大的项目,你将拥有许多头文件,预处理器将使用更多的代码扩展到另一个。更改一个.h文件将触发包含它的所有文件中的重新编译。
  • 另一个是它(可能)导致更大的二进制文件,因为该代码被复制到其他目标文件中。