如果包含析构函数,则类的大小会增加
Size of a class increases if destructor is included
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
class Size: 4
我得到的输出没有析构函数:
尺寸:4
class Size: 4
为什么包含析构函数会增加大小?
思考delete[]
的工作原理。如果没有析构函数,很可能它所需要做的就是将地址传递给free
。但是如果有析构函数,它必须知道数组中有多少个元素,这样它就知道调用析构函数的次数。所以需要一些额外的空间来容纳数组的大小。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 数组索引的值没有增加
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 为什么我的代码在输出中增加了93天
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 使用mongocxx驱动程序时包含头文件问题
- 如何在h文件中包含.o对象文件
- 有效地使用std::unordered_map来插入或增加键的值
- 在混合代码库中将C转换为C++时出现许多包含错误
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- 为什么您需要C++头文件的包含保护
- 包含命名空间会增加exe的大小吗
- 如果包含析构函数,则类的大小会增加
- 为什么只包含iostream.h会使可执行文件的重量增加1mb