在使用-O3编译的C ++中,没有虚拟性的继承是否具有以下成本:
如果答案是肯定的:为什么?
作为一个例子:MyClass1和MyClass2在性能和内存方面是否相同?
答案 0 :(得分:8)
执行时间
什么?函数是静态解析的,因此函数调用是相同的。 MyClass1
的构造函数将调用基类的构造函数,并且它的析构函数将调用基类的析构函数,因此对于构造和构造函数来说。破坏可能会有一些开销。 也许。有些编译器可能会优化呼叫。
存储器
这将是相同的,两者都只有一个成员double
。理论上。取决于实现我猜,因为标准没有规定,但最常见的是没有内存开销。
注意通过指向MyClass1
的指针删除对象Derived
会导致未定义的行为,因为没有virtual
析构函数。
注意2 没有多态的继承是代码气味。不是说这是错的,但在大多数情况下,成分更好。
答案 1 :(得分:-3)
就内存空间而言,我猜你的MyClass1消耗更多,因为它需要跟踪所有类结构和关系。为了表现,我没有看到任何显着的差异。