打印
[牛人杂谈]

结构体变量的sizeof

[复制链接]
791|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
734774645|  楼主 | 2016-10-30 20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一般来说,结构体变量占据的内存大小是所有成员变量占据内存大小之和,但有些例外需要特别注意,先看一个结构体:
struct ExS1
{
char c1;
short s1;
int i1;
};
从字面上来看,sizeof(ExS1)的结果似乎应该是1+2+4=7,但实际上,返回结果为8,这牵扯到字节对齐机制。


沙发
734774645|  楼主 | 2016-10-30 20:09 | 只看该作者
字节对齐的细节和编译器实现相关,一般而言有三个准则:
  • 结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
  • 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节。

      3 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
  字节对齐有助于加快计算机的取数速度,节省指令周期。对于示例结构ExS1来说,根据准则2,需要在c1和s1之间填充如一个空字节,所以整个结构的长度变为8.变化一下ExS1的成员顺序如下:
struct ExS1
{
short s1;
int i1;
char c1;
};
结果总长度变为了12.根据准则2,需要在s1和i1之间加入两个空字节,根据准则3,需要在c1后加入3个空字节,最后,结构体变量的大小如下所示:2+2+4+1+3=12

使用特权

评论回复
板凳
heisexingqisi| | 2016-10-30 20:24 | 只看该作者
主要用于未知情况下,开辟空间用

使用特权

评论回复
地板
dongnanxibei| | 2016-10-30 22:05 | 只看该作者
这个还可以测量每个类型的大小。因为不同平台可能变量类型对应的存储空间是不同的。

使用特权

评论回复
5
玛尼玛尼哄| | 2016-10-31 12:50 | 只看该作者
高手的程序中经常出现这个,实现跨平台移植必须的一个操作符

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

197

主题

3445

帖子

14

粉丝