sizeof()求所占内存的长度

C/C++中不同数据类型所占用的内存大小

                   32位                              64位 

char 1 1

int 4 大多数4,少数8

short 2 2

long 4 8

float 4 4

double 8 8

指针 4 8

(单位都为字节)

结构体(struct):比较复杂,对齐问题。结构体类型需要考虑到字节对齐的情况,不同的顺序会影响结构体的大小。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。

联合(union):所有成员中最长的。

枚举(enum):根据数据类型。

结构体计算要遵循字节对齐原则

结构体默认的字节对齐一般满足三个准则:

  1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

  2. 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);

  3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)

其实 暂且不管这三原则,我的方法只要记住第三个,就是结构体大小结果要为成员中最大字节的整数倍

先看下面定义的两个结构体.

struct { char a; short b; char c; }S1;

struct { char a; char b; short c; }S2;

分别用程序测试得出sizeof(S1)=6 , sizeof(S2)=4

注意 为什么 仅仅改变了结构体成员的顺序,结果不一样?

解:

(1)首先找出成员变量中最大的字节,可见对于S1和S2 最大是short ,占2个字节,

(2)所以以后都已2个字节为准,也就是说最多只要2个字节,其他填充占位,注意下图一个格子表示一个字节,

(3)所以先画2个格子,以后看成员顺序,逐次增加,每次一2为增加基准

对于S1 ,来说,顺序是 char->short->char      

第一个char占一个字节 多的这一个补0,只是占位作用
short 刚好占2个字节
第二个char也占1个 多的这一个补0
所以对于S1结构体大小为 2*3=6,至于为什么第二个char,多的那个字节不丢到,就是遵循第三个原则,就是结构体大小结果要为成员中最大字节的整数倍

对于S2 嘛,也画个图,但是顺序是 char->char->short

第一个char占一个字节 第二个char占一个字节
short 刚好占2个字节
S2=2*2=4

按照这个方法再看这样的一个结构体:

struct stu1
{
int i;
char c;
int j;
};

很明显:最大字节为4个。顺序int char int

stu1
int int int int
char 0 0 0
第二个int int int int
因为 int占4个,而char已经咱了一个,不够,所以那三个只能多余占位

Stu1=3*4=12

那么换一下呢?

struct stu2
{

           int i;             
           int j;
           char  c;
     };

Stu2=3*4=12;

再看一个:就是当结构体成员变量是另外一个结构体时,只要把结构体中成员为另一结构体作为整体相加就行

typedef struct A
{
char a1; //1个
short int a2; //2
int a3;
double d;

}; //以8个为准

A=16

typedef struct B
{
long int b2;
short int b1;
A a;

};

而对于B,先不要管A a,也就是先去掉A a 成员结构体B 算得 其为8,所以最后结果为8+16=24;24才是最后结果

联合:
union u //u的大小是其中最大的double类型成员a,所以sizeof(u) = sizeof(double) = 8;
{
double a;
int b;
};

原文:https://blog.csdn.net/zhangyulin54321/article/details/7737823

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值