C语言结构体(sizeof长度)偏移量的简单研究

总能够网上搜到这样的,关于结构体sizeof的答案,然而,经过这个简单的实验以后,发现gcc5.3编译的结果并非如此。
字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:

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

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

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

#include <stdio.h>

typedef unsigned char U8;
typedef unsigned short U16;
typedef unsigned int U32;
typedef unsigned long long U64;

typedef struct type1{
	U8 size8;
	U32 size32;
	U16 size16;
}type1;

typedef struct type2{
	U8 size8;  U16 size16;
	U32 size32;
}type2;

int main(int argc, char * argv[]){

	U8 size8;  U16 size16;  U32 size32;  U64 size64;
	printf("U8:%d, U16:%d, U32:%d, U64:%d\n", 
		sizeof(size8), sizeof(size16), sizeof(size32), sizeof(size64));

	printf("type1:%d\ttype2:%d\n", sizeof(type1), sizeof(type2));
	return 0;
}

  输出结果如下:

U8:1, U16:2, U32:4, U64:8
type1:12        type2:8

  结论:

在GCC(暂时仅限于5.3版本的测试)中,C语言(未测试C++情况)结构体的长度有如下规则:

1.结构体的偏移量为结构体中最宽基本类型成员大小; 

2.结构体的总大小为结构体偏移量的整数倍;

1&2 => 结构体的总大小为结构体最宽基本类型成员大小的整数倍;

3.结构体的每一个成员会按照结构体的位置排布,当遇到其中成员的长度不是偏移量的整数倍时,编译器(gcc5.3)会先视该成员的下一个成员的长度,判断是否需要空出(“偏移量”类似与键盘Tab的作用)。

转载于:https://www.cnblogs.com/pureLaw/p/7065055.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值