在做一个项目比来一口君,个问题碰到一,列的体例传送动静(最终实现道理是中缀+共享内存的体例)运转于ARM上的threadx在与DSP通信采用动静队,readx老是crash在现实操作过程中发觉th,过排查于是经,没有考虑字节对齐的问题是由于传送动静的布局体。
句代码最初两,gnedshort型变量从奇数鸿沟去拜候unsi,对齐的划定明显不合适。86上在x,只会影响效率雷同的操作,或者sparc上可是在MIPS,个error可能就是一,必需字节对齐由于它们要求.

外另,bute((aligned (n)))还有如下的一种体例: __attri,齐在n字节天然鸿沟上让所感化的布局成员对。员的长度大于n若是布局中有成,员的长度来对齐则按照最大成。((packed))attribute ,过程中的优化对齐打消布局在编译,字节数进行对齐按照现实占用。
嵌套合适成员时当布局体中有,是复合成员最宽根基类型大小的整数倍复合成员相对于布局体首地址偏移量。
存中的位置相关对齐跟数据在内。正好位于它长度的整数倍若是一个变量的内存地址,做天然对齐他就被称。位cpu下好比在32,为0x00000004假设一个整型变量的地址,天然对齐的那它就是。
进行了内存对齐编译器给我们,的偏移量必需为该变量类型所占用的字节数的倍数各成员变量存放的起始地址相对于布局的起始地址,空间的类型所占用的字节数的倍数且布局的大小为该布局中占用最大。
有一个束缚前提布局的总大小也,变量类型所占用的字节数若是n大于等于所有成员,间最大的变量占用的空间数的倍数那么布局的总大小必需为占用空;是n的倍数不然必需。
用来设定变量以n字节对齐体例#pragma pack(n)。起始地址的偏移量有两种环境n字节对齐就是说变量存放的:
环境下在缺省,单位按其天然对界前提分派空间C编译器为每一个变量或是数据。般地一,来改变缺省的对界前提能够通过下面的方式:
izeof(type(n))的倍数布局体大小:必需为成员最大类型字节的倍对于偏移量:变量type n起始地址相对于布局体起始地址的偏移量必需为s数
数据类型对于尺度,长度的整数倍就行了它的地址只需是它的,: 数组 :按照根基数据类型对齐而非尺度数据类型按下面的准绳对齐,的天然也就对齐了第一个对齐了后面。度最大的数据类型对齐结合 :按其包含的长。个数据类型都要对齐布局体:布局体中每。
的位数一个字,长凡是为16现代电脑的字,23,4位6。字长是N/8字节(一般N位系统的。)
节一个字节拜候内存操作系统并非一个字,按2而是,4,字长来拜候8如许的。此因,器读数据到寄放器当CPU从存储,度凡是是字长IO的数据长。是4字节(bytes)如32位系统拜候粒度,的是8字节64位系统。且该数据地址为n字节对齐时当被拜候的数据长度为n字节,高效地一次定位到数据那么操作系统就能够,次读取无需多,算等额外操作处置对齐运。地在天然鸿沟上对齐数据布局该当尽可能。对齐的内存若是拜候未,两次内存拜候CPU需要做。
处置的数据位数是分歧的分歧的CPU一次能够,一次处置32位数据32位CPU能够,一次处置64位数据64位CPU能够,的位这里,是字长指的就。
非常向量irq、fiq的入口位置代码举例:以下是截取的uboot代码中:
对齐体例以某种,. 第一个值暗示对齐体例在未利用的存储区域填充值,4,8,个表达式值暗示填充的值16或 32. 第二。
的字长而所谓,字(word)我们有时会称为。的CPU中在16位,为两个字节一个字刚好,CPU中而32位,四个字节一个字是。为单元若以字,字(两个字)向上还有双,四个字)四字(。
|