结构体内存对齐问题解析2(内含有实际测试代码)

 

测试环境:visual studio2019


#include <stdio.h>

//取结构体某成员在结构体内部的偏移
#define MY_OFFSET(st,field)   (size_t)&(((st*)0)->field)

struct A {
	int a;//4
	char b;//1
	short c;//2
};//7    8

struct B {
	char b;//1
	int a;//4
	short c;//2
};//      12

struct C {
	char b;//1
	short c;//2
	int a;//4
};//      12

typedef struct {
	char a;//1
	short b;//2
	char c;//1
	int d;//4
	char e[3];//3
	struct A my_A;
	struct B my_B;
}test;

int main()
{
	test st;
	printf("size = %d\n a-%d\n b-%d\n c-%d\n d-%d\n e-%d\n my_A-%d\n my_B-%d\n",
		sizeof(test), MY_OFFSET(test,a), MY_OFFSET(test, b), MY_OFFSET(test, c), MY_OFFSET(test, d),
		MY_OFFSET(test, e), MY_OFFSET(test, my_A), MY_OFFSET(test, my_B));
	//printf("sizeof(struct A) = %d\n", sizeof(struct A));
	//printf("sizeof(struct B) = %d\n", sizeof(struct B));
	//printf("sizeof(struct C) = %d\n", sizeof(struct C));
	//printf("sizeof(test) = %d\n", sizeof(test));
    printf("Hello World!\n");
}

测试结果:

 

理论分析:测试test结构体的大小

 

理论分析技巧:(重要),尤其是第二条

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

(2)结构体每个成员相对结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);上面图一左边的地址编号就是偏移量offset

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

 

 

参考文章:https://www.toutiao.com/i6836353231191278083/?tt_from=mobile_qq&utm_campaign=client_share&timestamp=1591838911&app=news_article&utm_source=mobile_qq&utm_medium=toutiao_ios&use_new_style=0&req_id=2020061109283101012903513003789D13&group_id=6836353231191278083

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值