C++中sizeof(this)与类实例大小差异原因及编译期内存适配验证
问题分析与解决方案
一、为什么类内部与外部的sizeof结果不同
你看到的sizeof(this)返回8,本质是因为**this是一个指针**:
- 在类A的成员函数中,
this的类型是A*(指向A类实例的指针);在类B的成员函数中,this的类型是B*(指向B类实例的指针)。 - 在64位操作系统环境下,所有指针类型的大小固定为8字节,和指向的对象本身大小无关。
- 而外部的
sizeof(a)、sizeof(b)是直接计算类实例的内存占用:A类有3个int成员(每个int占4字节),所以总大小12;B类继承A的3个int,加上自身3个int,总大小24,这和你看到的输出完全匹配。
二、编译期验证自定义类是否适配指定内存空间
要在编译阶段完成验证,直接用C++的static_assert关键字,结合sizeof判断类实例大小是否符合要求:
比如假设C库队列要求元素最大内存为32字节,验证代码如下:
#include <iostream> using namespace std; class A { int x, y, z; public: A() {} void PrintSize() { cout << sizeof(this) << endl; } }; class B : public A { int a, b, c; public: B() {} void PrintSize() { cout << sizeof(this) << endl; } }; // 编译期验证:A类实例大小不超过16字节 static_assert(sizeof(A) <= 16, "A类实例大小超出指定内存限制"); // 编译期验证:B类实例大小不超过32字节 static_assert(sizeof(B) <= 32, "B类实例大小超出指定内存限制"); int main() { A a; B b; a.PrintSize(); b.PrintSize(); cout << sizeof(a) << endl; cout << sizeof(b) << endl; }
- 如果类实例大小超过限制,编译器会直接抛出你指定的错误信息,阻止程序编译,实现编译期的提前验证。
- 这种方式比运行时检查更高效,能更早发现适配问题。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

