sizeof计算类的长度

        今天看程序员面试宝典,发现一道sizeof与类的长度有关的试题,于是动手实验了一下,发现还挺有趣。

        当然,那本书上所讲的东西略浅显,我个人进行了一些总结与挖掘!!

        ①空类大小为1,多重继承的空类大小也为1,其实说到底,大小为1只是为了表现出这个类的存在,否则大小为0,连内存分配都没有,类就根本不存在了。

        ②类中含有虚函数则类的长度(sizeof计算)增加一个指针长度。因为这里涉及到虚表,需要用一个指针指向虚表。

        ③类中的私有/公有/保护变量能够改变类的大小,一般都使用了内存对齐机制。

        ④继承类的性质如上,但是这仅仅是指实继承,如果是虚继承则是另一回事了。

         。。。。。

         前提条件,在我的机器上:sizeof(int) = 4,sizeof(int*) = 8.内存是以8个字节为单位对齐的。(64位系统)

         现在进行测试,毕竟语言略显苍白。

         

class A
{
public:
    virtual void f() {} 
    virtual void g() {}
    int y;
    int z;
private:
    int k;
    int h;
protected:
    char zz;
};
sizeof(A)的长度是多少??答案是32,有了虚函数便有了虚表,需要一个指向这个虚表的指针,大小为8,虚函数的多少对大小是没有影响的,5个变量,由于内存对齐的关系,4个整型16个字节,1个char型8个字节,一共是32个字节。

下面进行继承方面的测试,增加如下代码:

class B:  public A
{
};
我们发现sizeof(B) = sizeof(A) = 32,毕竟构造继承类需要先构造基类。

改写继承类B为如下代码:

class B:  public A
{
public :
    virtual void ff() {}
private:
    int kk;
    int hh;
protected:
    char zzz;
};

此时sizeof(B) = 40,即5个指针长度,为什么呢?原因是除了包含基类的4个指针长度外,对B而言又新增了2个整型变量和1个char型变量,基类的char型变量压缩到4个字节了,2个整型变量占8个字节,1个char型变量占4个字节,正好40个字节。

接下来探讨最后一个重点:虚继承(共享继承)

class B:  public  virtual A
{
public :
    virtual void ff() {}
private:
    int kk;
    int hh;
protected:
    char zzz;
};

如上代码只是把B的继承方式增加了一个virtual,但是此时sizeof(B) = 56,一下就增加了这么多!!!why??原因是增加了一个虚类指针,8个字节,2个整型变量占用8个字节,1个char型变量占用8个字节,至于为什么如此是因为此时内存分配与上面是完全不一样的,想了解更多需要去看看虚继承与普通继承的区别。
### 使用 `sizeof` 运算符计算 C/C++ 中结构体的大小 在 C 和 C++ 编程语言中,`sizeof` 是一种用于查询数据型或对象所占字节数的操作符。对于结构体而言,其大小不仅取决于各成员变量本身的尺寸,还受到内存对齐规则的影响。 #### 内存对齐原则概述 当定义一个结构体时,编译器为了提高访问效率会对成员进行适当排列,使得每个成员相对于结构体起始地址的位置满足特定条件——这就是所谓的“内存对齐”。具体来说: - 成员变量按照声明顺序依次存储; - 每个成员的实际偏移量应为该型的自然边界(通常是其自身的大小)或是编译环境指定的最大对齐值中的最小者[^3]; - 整个结构体最终占用的空间将是最大对齐粒度的整数倍,可能因此而存在填充空间。 #### 示例代码展示 下面通过一段简单的例子来说明如何利用 `sizeof` 获取结构体实例的具体长度: ```cpp #include <iostream> struct ExampleStruct { char c; // 占用 1 字节 int i; // 占用 4 字节, 需要在前面补足至 4 的倍数 }; int main(){ std::cout << "Size of struct is: " << sizeof(ExampleStruct) << " bytes." << std::endl; return 0; } ``` 上述程序将输出结构体 `ExampleStruct` 所需的真实内存量。需要注意的是实际运行结果可能会因不同平台和编译选项有所差异。 由于内存对齐的存在,即使两个连续字段只相差几个字节,也可能因为补齐到合适的边界而导致整体体积增大很多。例如上面的例子中虽然只有5个有效字节的数据 (char + int),但由于对齐原因,整个结构体会被分配至少8个字节以上的空间。 #### 影响因素分析 除了基本语法外,影响 `sizeof(struct)` 返回值得要素还包括但不限于: - **目标架构**:不同的 CPU 架构下指针宽度各异,这直接影响到了含指针成员的复合型的整体规模。 - **编译参数**:某些情况下可以通过命令行开关调整默认对齐方式,进而改变最终测量的结果。 - **内部布局优化**:现代编译工具链往往具备自动重排字段次序的能力,旨在减少不必要的间隙浪费并提升缓存命中率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值