【问题标题】:Size of a class increases if destructor is included如果包含析构函数,则类的大小会增加
【发布时间】:2015-07-14 09:04:05
【问题描述】:
class MyClass {
        int data;
        public:
        MyClass() : data(0) { /*cout << "Ctor" << endl;*/}
        void* operator new(size_t sz) { cout << "Size in new: " << sz << endl; void* s = malloc(sz); return s; }
        void* operator new[] (size_t sz) { cout << "Size: " << sz << endl; void* s = malloc(sz); return s; }

        void operator delete(void* p) { free(p); }
        void operator delete[](void* p) { free(p); }
        ~MyClass() {}
};
int main() {
        // your code goes here
        MyClass* p = new MyClass[1];
        delete[] p;
        cout << "Size of class: " << sizeof(MyClass) << endl;  
        return 0;
}

这里我重载了 new 和 delete 操作符。我在这里观察到的奇怪行为是,如果我包含传递给 new 运算符的析构函数大小增加了 4,而 MyClass 的大小仍然是 4,这很明显。

我得到的输出是析构函数:
尺寸:8
班级人数:4人

我得到的输出没有析构函数:
尺寸:4
班级人数:4人

为什么包含析构函数会增加大小?

【问题讨论】:

  • 尝试创建一个包含 100 个对象的数组,看看是否分配了 800 个字节或 404 个字节,看看是否能告诉你什么。
  • ^^^ 另外,你应该使用 C++ 全局操作符 new 而不是 C malloc。

标签: c++ operator-overloading destructor new-operator sizeof


【解决方案1】:

想想delete[] 的工作原理。如果没有析构函数,很可能它需要做的就是将地址传递给free。但是如果有析构函数,它必须知道数组中有多少元素,这样它就知道调用析构函数的次数。所以需要一些额外的空间来保存数组的大小。

【讨论】:

  • 那么在这种情况下,为了保存我们正在创建的对象的数量,删除运算符会为自己创建一个变量来保存该值?
  • @Gaurav 不是真正的变量,只是分配块中的一些额外空间。
  • 如果我不提供析构函数,它不会调用编译器提供的默认析构函数,在这种情况下它也应该显示 size+4 来保存对象的数量。 @大卫施瓦茨
  • @Gaurav 默认析构函数优化到什么都没有。 “为什么编译器不做它不需要做的事情”的答案是“因为它很聪明”。
猜你喜欢
  • 2018-01-28
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多