c/c++中使用sizeof计算结构体struct和类class的长度(字节)

来源:互联网 发布:快鸟地图软件 编辑:程序博客网 时间:2024/04/28 14:04

前言

结构体求sizeof

在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素长度都小于处理器的位数的时候,便以结构体内最长的数据元素为对齐单位,也就是说,结构体的长度一定是最长的数据元素的整数倍。如果结构体内存在的长度大于处理器位数的,那么就以处理器的位数为对齐单位。结构体内类型相同的连续元素,将在练习的空间内,和数组一样。多说无益,直接看程序。

struct {short a1;short a2;short a3;} A;struct {short a1;long a2;} B;cout<<sizeof(A)<<endl;cout<<sizeof(B)<<endl;


大家猜测结果是什么呢?

很多人以为是:6和6

正确答案是:6和8


为什么呢?

结构体A中有三个short类型的变量,各自以2字节对齐,长度为6字节。6是最大长度2的整数倍。故sizeof(A)=6;

结构体B中,long 占用4个字节,short占用2个字节,共6个字节,但是6不是4的整数倍,于是需要补空自己,增到8字节,即sizeof(B)=8

对类求sizeof

关于类,我将以两个例子来说明

列1:
class Student{public :bool isGirl;int age;bool beautiful;};
cout<<sizeof(Student);

结果为:12

列2:
class Student{public :bool isGirl;int age;bool beautiful;};
cout<<sizeof(Student);

结果:8
为什么会出现这种情况呢?
解析:这跟内存中数据对齐有关系。
列1对齐方式
|---------bool----------------|---------------------|---------------------|----------------------------|   三个字节用空格填充
|----------------------------------------------------int------------------------------------------------|
|---------bool----------------|---------------------|---------------------|----------------------------|   三个字节用空格填充
故12个字节
列2对齐方式
|----------------------------------------------------int------------------------------------------------|
|---------bool----------------|----------bool-----------|---------------------|----------------------|   2个字节用空格填充
故8个字节
列3:
class Student{public :int age;                static int schoolNum;};
cout<<sizeof(Student)<<endl;
结果:4
解析:因为静态变量式存放在全局数据区的,而sizeof计算栈中分配的大小,所以sizeof(Student)=4

2 0
原创粉丝点击