没有合适的资源?快使用搜索试试~ 我知道了~
c/c++自然对界详解
资源详情
资源评论
资源推荐
内存对齐
一. 什么是内存对齐
如下结构,sizeof(x_struct)=?
struct x_struct
{
char c_value1;//1 个字节
int i_value2;//4 个字节
char c_value3;//1 个字节
};
在 vc2003.net 编译环境中,sizeof(x_struct)=12,不是 6,这就是内存对齐,编译器为了提高存
取速度而做的优化。
二. 简单理解
内存是一块联系分配的空间,假设内存对齐单位是 4 字节,因此,如上结构对齐方式如下:
增加一个 char 项的结构 y_struct,又是怎么排列的呢?
struct y_struct
{
char c_value1;//1 个字节
char c_value2;//1 个字节
int i_value3;//4 个字节
char c_value4;//1 个字节
};
sizeof(x_struct) == sizeof(y_struct) == 12。
三. 深入理解
1、内存对齐的原因
结构体中数据的对齐方式因语言、编译器和 CPU 而异,但是通常的做法就是把数据成员放置在与该成员
的类型较为符合(也称自然放置)的地方。
大部分的参考资料都是如是说的:
1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在
某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内
存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
因此,字,双字,和四字在自然边界上不需要在内存中对齐。(对字,双字,和四字来说,自然边界分别
是偶数地址,可以被 4 整除的地址,和可以被 8 整除的地址。)
一个字或双字操作数跨越了 4 字节边界,或者一个四字操作数跨越了 8 字节边界,被认为是未对齐的,从
而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一
个总线周期中被访问。
某些操作双四字的指令需要内存操作数在自然边界上对齐。如果操作数没有对齐,这些指令将会产生一个
通用保护异常(#GP)。双四字的自然边界是能够被 16 整除的地址。
其他的操作双四字的指令允许未对齐的访问(不会产生通用保护异常),然而,需要额外的内存总线周期
来访问内存中未对齐的数据。
Win32 平台下的微软 C 编译器(cl.exe for 80x86)在默认情况下采用如下的对齐规则:任何基本数据类型
T 的对齐模数就是 T 的大小,即 sizeof(T)。比如对于 double 类型(8 字节),
就要求该类型数据的地址总是 8 的倍数,而 char 类型数据(1 字节)则可以从任何一个地址开始。
ANSI C 规定一种结构类型的大小是它所有字段的大小以及字段之间或字段尾部的填充区大小之和。
2、对齐规则
每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令
#pragma pack(n),n=1,2,4,8,16 来改变这一系数,其中的 n 就是你要指定的“对齐系数”。
规则:
i、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在 o7set 为 0 的地
剩余10页未读,继续阅读
pandaol
- 粉丝: 2
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0