金牌会员
 
- 积分
- 1993
- 金钱
- 1993
- 注册时间
- 2016-2-16
- 在线时间
- 527 小时
|
1金钱
本帖最后由 憨厚诚实大叔 于 2016-9-21 11:30 编辑
__align(32) u8 mem1base[MEM1_MAX_SIZE];
__align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));
类似这个,定义了2个u8的内存池,我硬件调试了下,发现他们每一个数组里面u8数据和u8数据都是挨着的,并不是一个u8占了32个字节,剩下的填充不用。也就是他们占了MEM1_MAX_SIZE和MEM2_MAX_SIZE个空间,而不是MEM1_MAX_SIZE*32和MEM2_MAX_SIZE*32个。也就是这个32字节对齐对于他们数组内部的数据存储是没有什么作用的。
这个字节对齐,首尾都要对齐,我的看法是对于第一个 __align(32) u8 mem1base[MEM1_MAX_SIZE]是内部内存池,加上32字节对齐后,内存为他分配的首地址就是32倍数的地址,然后内存块是32个一块。
加上这个__align(32)使得他分配出来的地址全部都是32字节对齐的,也就是地址是32的倍数。然后分配到的空间,4,8,16,32字节对齐都可以使用。
对于第二个__align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))),我们已经为他分配了首地址了,而且分配的首地址已经是32字节对齐的了,所以我们把这一个__align(32)去掉也是没问题的。
不知道我说的对不对,求来个大神解答一下。
至于那些字节对齐的好处什么的就不要多说了,我只想知道我上面说的这些对么。不对的话,为什么这里要加__align(32)呢?
如果是这样的话,是不是在项目中,我们给结构体分配空间,要分配合适的首地址给他,就是4字节对齐的结构体,首地址要分配4的倍数的,8字节对齐的结构体,首地址要分配8的倍数的给他,是这样的么。
|
最佳答案
查看完整内容[请看2#楼]
C语言的字节对齐 分配32字节的话先要和u8比较下 谁小按谁对齐 如果你是分配的4字节就和u8比较 发现比u8小 就按照4字节对齐 应该是这样的吧 我以前好像看过
|