一个结构体占用内存大小的问题

sizeo(结构体)的大小问题

先来看下面的示例代码:

struct Demo
{
    int a;
    int b;
};

int main()
{
    cout<<"Demo size = " << sizeof(Demo)<<endl;

    return 0;
}

毫无疑问,都会说,结果为 8
这时我提出一个问题?请问在32位和64位PC机上分别是多少,或许有些人就有些迷茫了。
实际上都等于 8,这时候可能有些人更加疑惑了
这里写图片描述

实际上 int 型数据在32位/64位都只占用4字节

下面我们再看一个例子:

struct Demo
{
    int* a;
};

int main()
{
    cout<<"Demo size = " << sizeof(Demo)<<endl;

    return 0;
}

直接上结果:
这里写图片描述
我们会惊奇的发现 对于int型指针,32位占4字节,64位占8字节,希望大家可以谨记这一点。

那么试问,如果将结构体里的 int* a 改为 char* a,那么结果优势如何?
哈!结果居然运行一样

struct Demo
{
    char* a;
};

int main()
{
    cout<<"Demo size = " << sizeof(Demo)<<endl;

    return 0;
}

这里写图片描述
是不是和大家想的不太一样呢?
其实指针默认情况下是int型指针

接下来可能就是面实中经常遇到了问题,给你一个结构体,那你计算出他占用的内存。(以下都是在32位机上所占用内存)

struct Demo
{
    char a;
    int b;
};

初学编程的人会说等于5,1+4 = 5 那么我们看看运行结果
这里写图片描述
很多人会表示惊讶,为什么是8呢?
实际上这里存在一个内存对齐的原因。

  • 首先 char 是 1 字节 int 是 4 字节,但是对于32位机,如果char 后面接着放 int 型的数据话,会有一个字节的数据会令其一行存放,这样会造成 int 型数据需要读取俩次才能被读取,所以采用内存对齐原则,另起一行存放 int 型数据。
    这里写图片描述

具体关于内存对齐原则,会在接下来的博客中提到。

这里给出一些规则总结,希望对大家有帮助:

  • char 1字节 int 4字节 double 8字节 int* 4字节
  • 首先看一个结构体中最大占用数据类型是几个字节,
  • 那么就是以这个字节数位对齐字节数,将结构体中各个数据依次排放,当放不下(出现一个数据需要放两行)的情况就令其一行放
  • 最终的占用内存一定是最大数据占用字节的整数倍
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值