You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:10:24