struct所占空间的计算

3 篇文章 0 订阅

文章来源:http://blog.csdn.net/p011235/article/details/48750725

关于如何计算struct所占用空间的大小:

有人可能觉得不就是把结构体内所有变量所占空间加起来不就可以了吗?其实,这句话只对了一半,所有变量所占空间要加起来没错,但是机器为了更加容易的取出struct里面的数据,会将里面的变量所占空间进行对齐。这是以空间换时间的一种方式。

如何进行对齐呢?

首先,是每个变量的偏移量对齐,每一个变量相对于首地址的位置就是偏移量。例如:

[cpp]  view plain  copy
  1. struct data {  
  2.     int a;//int型变量的大小4个字节  
  3.     char b;//char类型变量的大小1字节  
[cpp]  view plain  copy
  1. double c;//double类型变量的大小8字节  
[cpp]  view plain  copy
  1. }  
其中a的偏移量就是0,b的偏移量就是4,c的偏移量就是5,以此类推。要进行对齐的话,该变量的偏移量一定要是该变量大小的整数倍。c的偏移量是5,对齐以后就会变成8,在变量b和c之间会穿插3个字节。这就是每个变量的偏移量对齐了。

其次,结构体的大小一定要是所占字节数最大的变量大小的整数倍,有点绕口,举个例子就知道了:

[cpp]  view plain  copy
  1. struct data {  
  2.     int a;//4字节  
  3.     double b;//8字节  
  4.     char c;//1字节  
  5.     int d;//4字节  
  6. }  
在上面的例子中,对每个变量进行偏移量对齐以后算出字节大小是20字节,但是机器为了存取方便一定会在后面加4个字节变为24字节。就像下面这个截图:






在 C 或 C++ 中,计算一个对象所用的空间大小相对比较简单。 对于 C 语言,我们可以使用 `sizeof` 运算符来计算一个对象的大小,例如: ```c #include <stdio.h> #include <stdlib.h> int main() { int a; printf("Size of int: %ld bytes\n", sizeof(a)); return 0; } ``` 上述代码将输出 `Size of int: 4 bytes`,表示 `int` 类型所用的空间大小为 4 个字节。 对于 C++ 语言,我们同样可以使用 `sizeof` 运算符来计算一个对象的大小,例如: ```c++ #include <iostream> using namespace std; int main() { int a; cout << "Size of int: " << sizeof(a) << " bytes" << endl; return 0; } ``` 上述代码将输出 `Size of int: 4 bytes`,表示 `int` 类型所用的空间大小为 4 个字节。 需要注意的是,对于结构体和类等复杂类型的对象,其大小取决于其成员变量的类型和数量,需要逐个计算并累加,可以使用 `sizeof` 运算符和 `offsetof` 宏来计算。例如: ```c++ #include <iostream> #include <cstddef> using namespace std; struct Person { string name; int age; }; int main() { Person p; cout << "Size of Person: " << sizeof(p) << " bytes" << endl; cout << "Offset of name: " << offsetof(Person, name) << " bytes" << endl; cout << "Offset of age: " << offsetof(Person, age) << " bytes" << endl; return 0; } ``` 上述代码将输出 `Size of Person: 16 bytes`,表示 `Person` 类型所用的空间大小为 16 个字节,其中 `name` 字符串用 8 个字节,`age` 整数用 4 个字节,剩余 4 个字节为内存对齐所需的填充字节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值