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

多重继承中构造函数初始化列表调用sizeof的行为疑问

对尚未构造完成的派生类调用sizeof的行为分析

先看你给出的这段代码:

class WData1 : public Persistent, public Data { 
public: 
    WData1(float f0 = 0.0, float f1 = 0.0, float f2 = 0.0) : Data(f0, f1, f2), Persistent(sizeof(WData1)) {}
};

你的疑惑点很清晰:在Persistent基类的构造函数参数里用了sizeof(WData1),但此时WData1的对象还没完全构造出来——基类构造函数还在执行,派生类的部分都还没初始化,这时候调用sizeof到底会有啥问题?

其实这里有个关键知识点你可能没注意到:sizeof是编译期运算符,它的结果在代码编译的时候就已经确定了,和运行时有没有对象、对象有没有构造完成完全没关系。

具体到你的代码来说:当编译器处理WData1的构造函数时,WData1的类定义已经完整了——编译器能看到它继承的两个基类,也知道它有没有额外的成员(哪怕你没写,编译器也会处理虚函数表、内存对齐这些细节),所以它能直接计算出WData1对象的大小,把这个数值当成常量硬编码到你的程序里。等到程序运行时,调用Persistent构造函数时传的只是这个预先算好的常量值,根本不是在运行时去“测量”那个正在构造的、还没完全成型的对象。

再补充两个关键点:

  • 只有当WData1是不完整类型的时候(比如在类体还没写完就用sizeof),编译器才会报错,但你的构造函数是写在WData1的类体内部的,此时类已经是完整类型了,完全没问题。
  • 哪怕你把构造函数写在类体外,只要在写sizeof(WData1)的时候,WData1的完整定义已经被编译器看到,结果也是一样的——编译期就计算好大小。

所以结论很明确:你完全不用担心“对尚未存在的对象调用sizeof”的问题,因为sizeof从始至终都不关心运行时的对象状态,它只在编译阶段根据类的定义计算大小。

内容的提问来源于stack exchange,提问作者arvind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:24:55