【发布时间】:2012-12-18 00:02:13
【问题描述】:
考虑以下代码:
#include <iostream>
#include <type_traits>
class Base
{
public: static int f() {return 42;}
};
class Derived : public Base
{
protected: int x;
};
class NotDerived
{
protected: int x;
};
int main()
{
std::cout<<sizeof(Base)<<std::endl;
std::cout<<sizeof(Derived)<<std::endl;
std::cout<<sizeof(NotDerived)<<std::endl;
return 0;
}
使用 g++ 4.7 -O3,它会打印:
1
4
4
如果我理解得很好,这意味着启用了空基类优化。
但我的问题涉及运行时开销:与NotDerived 对象相比,创建(和破坏)Derived 对象是否有任何开销,因为Derived 应该构造/销毁相应的Base 对象?
【问题讨论】:
-
我会这么认为,但我也不认为你应该担心。您应该使用适合您工作的任何工具。在分析阶段处理任何优化。
-
这是我的代码的一个关键方面。使用空基类在设计方面对我有很大帮助,但由于我从事高性能计算工作,并且由于在执行过程中将创建数十亿此类对象,我应该关心这一点......
-
你应该关心,但我的问题是你是否应该这么早关心?既然你有数字,你有没有做过一些预测来看看你会在哪里?看起来,如果一开始就很担心,那么您能做的最好的事情就是提出最大可接受命中的硬数字,然后将它们与您的编译器进行比较,记住不同的编译器可能会产生不同的结果。 ..
-
这是个好问题。逻辑会规定,如果没有分配额外的内存,则不会有任何额外的内容要销毁,因此不会产生任何影响。汇编输出支持这一点,但我想由于这没有以任何方式标准化,你得到的任何答案都将取决于编译器。
标签: c++ optimization inheritance c++11 compiler-optimization