C语言结构体大小:内存对齐

问题描述:统一程序在不同电脑上编译时结果不同,其原因是因为内存未对齐,内存地址问题

                 通过计算结构体字节数来加深理解

1.相同变量类型字节数

规律:即为他们各自本身字节数相加

struct A
{
	int a;//4字节
	int b;//4字节
};//8字节


2.不同变量类型

规律:按顺序从上向下依次计算字节数
          第一个为本身类型字节数
         下一个为之前字节数的倍数,若不足则将其补充为倍数关系

例:char a为1字节,下一变量int b为4字节,但1不是4的倍数,所以将它补为4 的倍数即+3字节

struct B
{
	char a;//1字节+3
	int b;//4字节
};//8字节

例:char a为1字节,下一变量short b为2字节,但1不是2的倍数,所以将其补为2的倍数即+1

下一变量int c为4字节,之前字节数和为4字节(包括已经补充的字节数),4是4的倍数,所以不需要补充

struct C
{
	char a;//1字节+1
	short b;//2字节
	int c;//4字节
};//8字节

其他例子:

 
struct D
{
	char a;//1+3
	int b;//4
	int c;//4+4
	double d;//8
};

struct E{short a;//2+2int b;//4long long *c;//4};


3.考虑数组内存

计算数组内存时需要考虑,数组中每一个元素所分配字节数于下一元素所分配字节数是否相同

例:下例所计算得到字节数为10,如果此数组从内存为100的格子开始分配,则第一个元素所占格子为100~109

       第二个元素为110~109,但众所周知编译时系统以4个字节为单位,所以在编译第二个元素时是从112开始,即出现错误

所以此时规则为:计算数组元素字节数时,总数应为最大变量类型倍数,若不足,则补充

即下例总数为10,最大变量类型字节数为4,所以补充为4的倍数,即+2                           

struct F
{
	char a;//1+3
	int b;//4
	short c;//2
};//10+2,


4.不需要考虑对齐的应用
struct G
{
	char a;
	char x;//保留,不使用
	short b;
	int c;
};

5.特殊

此例12字节、16字节都满足,但优先选择更小的字节

struct H
{
	int a;//4
	struct HH
	{
		char b;//1+3
		int c;//4
	}d;
};//12

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值