您的位置:首页 > 编程语言 > C语言/C++

C++中,结构体与类的 sizeof 大小

2015-07-17 10:14 295 查看
最近看到一些关于 c++ 中结构体 sizeof 的题目,了解了一下具体的情况,现在整理一下。

struct B{
public:
char c;
int i;
char v;
};首先,对于一个结构体或是类,它的每一个元素有三个重要的属性: 1.偏移量,2.自身大小,3.补充大小。
一:偏移量

    偏移量可以看作是,该元素之前的所有元素的(自身大小+补充大小)的总和。也就是该元素的内存起始地址,距离结构体内存起始地址的偏移距离。

    偏移量必须满足一个条件: 偏移量的大小 = 自身大小 * n (n>=0)

二:自身大小

    自身大小就是当前元素的 sizeof 的值,也就是其默认所占内存空间的大小

三:补充大小

    补充大小的产生,是为了满足偏移量大小的约束条件的。如果当前元素的偏移量 不等于 自身大小的整数倍,那么会在前面一个元素的后面,添加上一定长度的内存空间,以满足  偏移量的大小 = 自身大小 * n  的这个约束条件。那么添加上的这额外的空间,就可以理解为  补充大小

四:额外要求

   对于结构体的内存空间,还有一个额外的要求:结构体的 sizeof 大小,必须是结构体中每一个元素大小的整数倍;

所以总结下来,结构体大小主要需要满足一下两点:

  1.对每一个元素来说: 偏移量的大小 = 自身大小 * n (n>=0)

  2.对结构体来说: 结构体的 sizeof 大小,必须是结构体中每一个元素大小的整数倍;

我们来看上面的那个例子

struct B{

public:
char c; //偏移量0,自身大小为 1
int i;//偏移量本身为1,但是int类型大小为4, 所以 char c 需要分配一个补充大小 3,以使得 int i 的偏移量为4
char v;//偏移量为 (0+1+3+4)=8,是 1 的整数倍

};

这样子的话,结构体的大小应该是: 4+4+1 = 9。 但是上述计算结果只满足了每一个元素的偏移量的要求,考虑到   结构体的 sizeof 大小,必须是结构体中每一个元素大小的整数倍 这个要求,9显然不是4的整数倍,因此结构体的大小会放大到 12,也就是会在最后一个元素 char v 后面补充大小为3的内存。

实际结果就是:

struct B{ //大小为12

public:
char c; //偏移量0,自身大小为 1,补充大小为3
int i;//偏移量本身为4,自身大小为4,补充大小为0
char v;//偏移量为8,自身大小为1,补充大小为3

};

再来看看另外的例子:

struct A{ //大小为 24

public:
int i; 偏移量为0,自身大小为4,补充大小为0
char c;偏移量为4,自身大小为1,补充大小为3
long l;偏移量为8,自身大小为8,补充大小为0
int j; 偏移量16,自身大小为4,补充大小为 4

};

class C{ 

public:
char c;//偏移量为0,自身大小为1,补充大小为0
char v;//偏移量为1,自身大小为1,补充大小为2
int i;//偏移量为4,自身大小为4,补充大小为0

};

因此,以后大家在计算结构体或类的大小的时候,只需要对每一个元素,严格的满足上述两条规范,即可以计算出正确的大小了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++