c++ - 包装类的内存开销

标签 c++ memory-management wrapper

在 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 a myInt* to a myDerivedInt*?

没有。如果它没有 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/

相关文章:

c++ - C++中的线程间通信

c++ - 构造函数初始值设定项列表未调用复制构造函数

ios - 我如何查看变量的引用计数?

对象的 C# 包装器

python - keras:返回 model.summary() 与 scikit 学习包装器

c++ - 'if' 表达式的求值

c++ - 函数返回 BYTE 数组

objective-c - CFSTR内存管理

c - 不确定如何正确使用 malloc() 和 free()

java - Google 搜索是否为应用程序提供 API?