在 C++ 中使用包装类时,例如
class myInt {
int _value;
public:
myInt( int value ) : _value( value );
int value() const { return _value; }
}
,与简单的 int 相比,是否有任何内存开销?
This answer说“如果没有虚函数就不行”,但我想了解确切的原因。
我查看了 ISO/IEC 14882:2003 的 § 10.3 [class.virtual],其中说:“声明或继承虚函数的类称为多态类。”我知道这样一个类的对象不需要在其中有一个 vtable 指针。
但我不明白它是如何得出它不必有任何内存开销的。我可以创建一个派生自 myInt 的类,并将其命名为 myDerivedInt。我不能执行从 myInt * 到 myDerivedInt * 的 dynamic_cast 吗?如果不是,为什么不呢?
最佳答案
Is there any memory overhead compared to a simple €int`?
我会说不是,但我不知道是否有保证。
I understand that objects of such a class do not need to have a vtable pointer in them.
如果多态类对象是在堆栈上创建的,并且它的地址从未被获取,编译器可能会发现它的函数从未被虚拟调用(动态调度)并且可以从堆栈中删除虚拟表指针。 (这仅适用于每个案例。其他地方的类实例可能包含 vtable 指针)。这种优化影响很小,所以我不担心它是否会。通常,从具有 vtable 的类继承的类在其实例中也会有一个 vtable 指针。
Can't I do a
dynamic_cast
from amyInt*
to amyDerivedInt*
?
没有。如果它没有 vtable 则不会。换句话说,如果 myInt
没有任何虚函数(或者没有从任何有虚函数的类继承),那么你不能从 MyInt* 中
到 dynamic_cast
MyDerivedInt*
。但是,您可以使用 static_cast
。
If not, why not?
因为myInt
中没有vtable。 vtable 存储dynamic_cast
所需的信息。
关于c++ - 包装类的内存开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229748/