2012-08-14 57 views
6

在C++与-O3编译,确实不继承虚拟性有个成本方面:在C++中的运行时继承成本(没有虚拟性)?

  • 执行时间
  • 内存

如果答案是肯定的:为什么呢?

作为一个例子:是MyClass1的和MyClass2等效在性能和存储器方面?

enter image description here

+0

理论上应该没有性能差异。在实践中...呃,去测量你的特定场景并找出(我不希望高优化级别有任何不同,但编译器可能无法内联基类构造函数调用,或者它可能无法执行EBO,或者......各种各样的事情都会发生,甚至可能会更快,找出的方法是衡量)。 – 2012-08-14 17:33:08

+0

[继承的代价是什么]的可能的重复(http://stackoverflow.com/questions/7210412/what-is-the-cost-of-inheritance) – 2012-08-14 17:38:32

+0

+1:好的图片。 – 2012-08-14 17:46:51

回答

8

执行时间

怎么样?函数是静态解析的,所以函数调用是相同的。 MyClass1的构造函数将调用基类的构造函数,其析构函数将调用基类的析构函数,因此对于构造&的销毁可能会有一些开销。 也许。有些编译器可能会优化掉电话。

存储器

这将是相同的,二者只有一个构件double。理论上。我认为这取决于实施,因为它没有被标准强制执行,但最常见的是没有内存开销。

注意通过指针Derived结果不确定的行为删除对象MyClass1,因为没有virtual析构函数。

注2没有继承多态性是一个代码味道。不要说这是错误的,但在大多数情况下,组合更好。

+0

由于构造函数和析构函数非常简单,它们应该是内联的,并且编译器将为这两个版本生成相同的代码。 – 2012-08-14 17:35:33

+0

关于构建和破坏:编译器是否会为Base中定义的重载运算符优化临时构造/销毁? – Vincent 2012-08-14 18:19:50

+0

@Vincent - 我不明白这个问题。超载的操作员和临时人员之间没有固有的联系。 – 2012-08-14 18:29:30

-3

在存储空间方面,我猜是因为它需要跟踪的所有类结构和关系,你MyClass1的消耗更多。对于性能我没有看到任何显着的差异。

+3

我怀疑这是真的。 – 2012-08-14 17:43:01

+0

借调。小心给出一个引文,或者至少推理? – delnan 2012-08-14 17:44:28

+0

类结构和关系由编译器处理。没有虚拟化,这些都没有运行时间的损失。 – 2012-08-14 17:45:28