求一个类的sizeof应考虑的问题

理解类的sizeof在不同继承方式下的差异
本文深入探讨了类的sizeof在空类、简单类、普通继承、虚继承等不同情况下的计算方法及背后的原理。通过实例分析,揭示了sizeof与类继承结构之间的复杂关系。
 昨天面试,面试官让我说一说求一个类的sizeof应该考虑的问题,心想,太好了,之前sizeof可是做了不少功夫,就说了类的非静态、非全局成员,如果有虚函数就要加上一个指向虚表的指针,4字节大小,然后说,大概是这样。面试官就问,虚函数的实现机制是?大概讲了一下虚表之类的东东,然后他问,那如果是虚继承呢,求sizeof还是一样的么?先是一愣,心想,妈呀,什么是虚继承呢,然后还是淡定地回了,应该也是一样的吧,都是用一个指针来指向续表,面试官便没怎么说。
    面试完都没怎么再去想sizeof的问题了,一直觉得没什么问题,不过今天一大早,回想一下,觉得不妥,上网搜了一番,发现,原来没有想象的简单,越看也越糊涂,索性自己在VC上写几个类试试,结果,果然是不一样的,昨天的面试果然是悲催了啊T_T
    还是先总结一下刚刚领会到的:
一、个空类
class A
};
    求sizeof的结果是1,因为即使是没有成员之类的,一个类存在,至少都要给他一个空间,不然就没有存在的意义了。
二、简单的类
class A
{
    int a;
    virtual fun();
}
    这个也好求,就是sizeof(A.a)+4(指向虚表的指针)
三、子类普通继承、父类中不含虚函数
class  A
{
    int a;
}
class B:public A
{
     int b;
     virtual fun();
}
sizeof(B)=sizeof(A)+sizeof(B.b)+4(指向虚表指针)
四、子类普通继承、父类含虚函数
class  A
{
    int a;
    virtual fun1();
}
class B:public A
{
     int b;
     virtual fun();
}
sizeof(B)=sizeof(A)-4(sizeof(A)中有一个指向虚表的指针)+sizeof(B.b)+4(指向虚表指针)
因为普通继承,子类和父类的虚函数存放在同一个虚表中,所以,只需要存一个指向续表的指针即可;
五、子类虚继承、父类不含虚函数
class  A
{
    int a;
   
}
class B:virtual public A
{
     int b;
     virtual fun();
}
sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)
六、子类虚继承、父类含虚函数
class  A
{
    int a;
    virtual fun1();
   
}
class B:virtual public A
{
     int b;
     virtual fun();
}
sizeof(B)=sizeof(A)+4(指示父类存放空间的起始偏移量)+sizeof(B.b)+4(指向B的虚表的指针)
虚继承时,父类和子类的虚函数表分开放,所以,分别存储两个指向对应续表的指针,因而不用减去sizeof(A)中续表指针的大小。

    之前看的那些sizeof的对齐问题都太基础了,二面果然深入点,准备还是不充分,没办法了,只能祈祷。。。
六自由度机械臂ANN人工神经网络设计:正向逆向运动学解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)内容概要:本文档围绕六自由度机械臂的ANN人工神经网络设计展开,详细介绍了正向与逆向运动学解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程的理论与Matlab代码实现过程。文档还涵盖了PINN物理信息神经网络在微分方程解、主动噪声控制、天线分析、电动汽车调度、储能优化等多个工程与科研领域的用案例,并提供了丰富的Matlab/Simulink仿真资源和技术支持方向,体现了其在多学科交叉仿真与优化中的综合性价值。; 适合人群:具备一定Matlab编程基础,从事机器人控制、自动化、智能制造、电力系统或相关工程领域研究的科研人员、研究生及工程师。; 使用场景及目标:①掌握六自由度机械臂的运动学与动力学建模方法;②学习人工神经网络在复杂非线性系统控制中的用;③借助Matlab实现动力学方程推导与仿真验证;④拓展至路径规划、优化调度、信号处理等相关课题的研究与复现。; 阅读建议:建议按目录顺序系统学习,重点关注机械臂建模与神经网络控制部分的代码实现,结合提供的网盘资源进行实践操作,并参考文中列举的优化算法与仿真方法拓展自身研究思路。
`sizeof` 在编程中是一个运算符,而不是函数。在 C 和 C++ 语言中,`sizeof` 是一个单目运算符,用于确定操作数所占用的内存大小(以字节为单位)。由于它在编译时进行计算,因此不会引入运行时开销,这是与函数调用不同的一个关键特性[^1]。 在 C 语言中,`sizeof` 可以用于基本数据型、变量、数组、结构体、联合体等,返回其占用内存的大小。例如,`sizeof(int)` 通常返回 4,表示 `int` 型占用 4 个字节的内存。在 C++ 中,`sizeof` 同样适用,并且它在和对象的大小计算中扮演重要角色,尤其是在涉及虚函数和内存对齐的情况下[^3]。 此外,`sizeof` 的结果型是 `size_t`,这是一个无符号整数型,定义在 `<stddef.h>`(C)或 `<cstddef>`(C++)中,专门用于表示对象的大小[^1]。由于 `sizeof` 是编译时计算的,因此它在程序运行时不会产生额外的性能开销[^2]。 ### 使用示例 以下是一个简单的 C 程序,演示了如何使用 `sizeof` 来获取不同型和变量的大小: ```c #include <stdio.h> int main() { int a; char b; float c; double d; printf("Size of int: %zu\n", sizeof(a)); // 输出 int 的大小 printf("Size of char: %zu\n", sizeof(b)); // 输出 char 的大小 printf("Size of float: %zu\n", sizeof(c)); // 输出 float 的大小 printf("Size of double: %zu\n", sizeof(d)); // 输出 double 的大小 return 0; } ``` ### 内存对齐的影响 `sizeof` 的结果可能会受到内存对齐规则的影响。例如,在某些平台上,一个包含 `int` 和 `char` 成员的结构体可能不会恰好占用 `int` 和 `char` 的大小之和,而是会因为对齐要而占用更多的空间。例如,一个 `int` 占 4 字节,一个 `char` 占 1 字节,结构体可能总共占用 8 字节而不是 5 字节[^4]。 ### `sizeof` 与 `strlen` 的区别 在处理字符串时,`sizeof` 和 `strlen` 之间存在显著差异。`sizeof` 返回的是字符数组(包括终止空字符 `\0`)的总大小,而 `strlen` 返回的是字符串中字符的实际数量(不包括终止空字符)[^3]。 ### 和对象的大小计算 在 C++ 中,`sizeof` 可以用于和对象的大小计算。对于没有虚函数的,`sizeof` 返回的是中所有数据成员所占内存的总和(考虑内存对齐)。如果中包含虚函数,则 `sizeof` 还会包括一个指向虚函数表的指针(虚指针)所占用的空间。 ### 总结 - `sizeof` 是一个编译时运算符,不是函数。 - 它用于确定操作数所占内存的大小(以字节为单位)。 - 其结果型为 `size_t`。 - 结果可能受到内存对齐规则的影响。 - 在和对象的大小计算中,`sizeof` 会考虑虚函数表指针的存在。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值