对对齐(alignment) 的一些认识对对齐(alignment) 的一些认识关于内存地址对齐,尤其是 struct 中成员的对齐导致的 struct 的 size 问题很多人( 包括我:() 似乎都没有一个比较清晰的认识,所以产生了整理这方面思路和帖子的想法,下面的文字是资料、文档、实验和推测的混合体, 有错误是肯定的:)。能给您提供一点帮助, 是我最大的愿望。( 有点麻了) 引: struct s {char c;int i;}; 在 sizeof(char)=1 sizeof(int)=4 的情况下 sizeof(struct s) 为什么经常是 8 不是 5? 这个就是对齐(alignment) 的缘故。那么什么是对齐?现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始, 但实际情况是在访问特定变量的时候经常在特定的内存地址访问, 这就是对齐。为什么呢? msdn for vc6 中有这么一段: This principle is especially important when you write code for porting to multiple processors. A misaligned 4-byte data member, which is on an address that is not a multiple of four, causes a performance penalty with an 80386 processor and a hardware exception with a MIPS® RISC processor. In the latter case, although the system handles the exception, the performance penalty is significantly greater. 大意是: 1. 某些硬件平台只能在某些地址处取某些特定类型的数据, 否则抛出硬件异常。 2. 其余的硬件平台虽然可以在任何地址处取得任何类型的数据, 但如果变量没有对齐的情况下, 取这个数据可能有效率上的损失。所以为了不出错或者优化, 在访问特定变量的时候要在特定的内存地址访问, 这也是很多时候管对齐叫优化对齐的缘故。普通情况下编译器负责做这件事情。对齐问题在移植的时候尤其需要考虑进去。一、 vc6 和 i386( 以下所说 gcc 均为这个版本) 如何做这件事情的 1. 基本类型的数据(int,double 等) 依编译器有不同的对齐策略在 vc6 中基本类型的数据对齐在 sizeof( 基本类型的数据)上( 以下说" 对齐在 N上" 的意思就是:地址%N=0) 在 gcc中 cha r 对齐在1上, shor t 对齐在2上, int 对齐在4上, doubl e 对齐在 4 上。这里有一个概念: alignment-requirement( 不知应该翻译成什么), 对应的就是上面的 N,即 short 的 alignment-requirement 是2, int 的 alignment-requirement 是4 的基本类型的数据成员对齐和 struc
对对齐(alignment)的一些认识 来自淘豆网m.daumloan.com转载请标明出处.