关于内存对齐详细解释

什么是内存对齐?

    在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自的空间相加,这里涉及到内存对齐的问题。访问未对齐的内存,处理器需要访问两次(数据先读高位再读低位然后进行拼接),而访问对齐的内存,只需要一次。为了提高效率,所以进行内存对齐。windows的默认对齐数是8,linux中默认对齐数为4.

为什么会产生内存对齐的原因?

1.平台原因:

某些平台只能在特定的地址处访问特定类型的数据。

2.性能原因:

(1)数据结构(尤其是栈)应该尽可能在自然边界上对齐。

(2)为了访问未对齐的内存,处理器需要作两次内存访问;而未对齐的内存仅需要访问一次。

编译器是怎样进行内存对齐的优化的?

    在内存中,编译器按照成员列表顺序分别为每个结构体变量成员分配内存,在存储过程中需要满足边界对齐要求时,编译器会在成员之间留下额外的内存空间。

    结构体或联合体的数据成员、第一个成员放到0编译地方,以后每个数据成员放到自身对齐的整数倍偏移处。(结构体大小必须是最大对齐数的整数倍)。

 

字节对齐可以程序控制,采用指令:

#pragma pack(1)//1字节对齐

#pragma pack(2)//2字节对齐

#pragma pack(4)//4字节对齐

#pragma pack(8)//8字节对齐

 

举个栗子:

struct A{

    char     c;

    double d;

    short     s;

    int         i;

}

当系统以8字节对齐时

 

程序验证一下:

#pragma pack(8)
#include<iostream>
#include<cstdio>

struct A
{
	char    c;
	double	d;
	short   s;
	int     i;
};
int main()
{
	struct A a;
	printf("A所占大小为%d字节\n",sizeof(struct A));

	return 0;
}

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值