2010-04-07 80 views
8

Visual Studio允许您创建“内联”类(如果我没有误认为名称)。 所以类头和实现全部在一个文件中。“内联”类的惩罚

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

所以我想知道是否有这样做的惩罚?有什么缺点?

非常感谢

+0

很酷,非常感谢您的回复:) – kirbo 2010-04-07 19:49:26

回答

0

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

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

8

这样做的任何处罚?有什么缺点?

是。如果您需要更改该类的实现,由于它位于头文件中,因此该类的所有用户都需要重新编译,即使它们只应该关注接口。对于某些项目来说,这可能相当昂贵。

2

您可以在任何编译器的头部放置一个类的完整实现。从编译时间的角度来看,通常会受到一定的惩罚 - 头文件将为包含它的每个源文件单独编译。

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

0

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

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

其所有的定义和说明,不应使虽然除了编译时间对大文件的任何区别是* .h文件。

+3

内联说明符更常用于强制内部链接。 – 2010-04-07 19:49:56

+0

@Billy ONeal +1:没错!当我想在头文件本身中声明和定义一个自由函数并避免链接器问题时,我多次使用内联。 (主要是因为我不想为这个小函数创建一个* .cpp文件:)) – Akanksh 2010-04-07 19:53:02

0

有两个 “处罚规定”

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

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

1

还有另一个潜在的损失:性能。 如果内联过多的函数,会导致代码膨胀,导致可执行文件的功能和循环可能无法放入目标CPU的指令缓存中。