LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 889|回复: 3

内存对齐的问题

[复制链接]
发表于 2010-1-11 21:21:23 | 显示全部楼层 |阅读模式
  1. align(4) unsigned int  i_v;
  2. align(4) unsigned int  i_a[100]
复制代码

第一个声明表示变量i_v的内存地址必须能被4整除或4的倍数,那么第二个对齐的数组什么意思呢?
我认为第二种对数组的对齐声明表示在该数组中,内存的一次读写按照4个byte进行的,就是说
该数组的一次读取的是4个字节,而不是说该数组的首地址是4字节的对齐的。
再者
  1. typedef  packed struct
  2. {
  3.   uint32 a;
  4.   uint32 b;
  5.   char    c;
  6.   long    d;
  7. }DT_X;
  8. align(2) DT_X dt_v;
复制代码
是不是有些多余?
 楼主| 发表于 2010-1-11 21:36:02 | 显示全部楼层
假设你的数据按照一个item为4个字节格式存放到NAND flash中某个block中,如果从block中的
某个page中读到buffer中
  1. self->read_page(buffer);
复制代码
如果buffer不是4字节对齐的,那么从buffer中就不能完整的读取任一个item
回复 支持 反对

使用道具 举报

发表于 2010-1-12 13:00:09 | 显示全部楼层
Post by sybaselu;2063580

  1. align(4) unsigned int  i_v;
  2. align(4) unsigned int  i_a[100]
复制代码


第一个声明表示变量i_v的内存地址必须能被4整除或4的倍数,那么第二个对齐的数组什么意思呢?
我认为第二种对数组的对齐声明表示在该数组中,内存的一次读写按照4个byte进行的,就是说
该数组的一次读取的是4个字节,而不是说该数组的首地址是4字节的对齐的。
再者

  1. typedef  packed struct
  2. {
  3.   uint32 a;
  4.   uint32 b;
  5.   char    c;
  6.   long    d;
  7. }DT_X;

  8. align(2) DT_X dt_v;
复制代码

是不是有些多余?


我认为第二种对数组的对齐声明表示在该数组中,内存的一次读写按照4个byte进行的,就是说
该数组的一次读取的是4个字节,同时也是说该数组的首地址是4字节的对齐的。

我觉得不多余,是让struct结构体的首地址是4字节的整数倍。
回复 支持 反对

使用道具 举报

发表于 2010-1-12 13:01:55 | 显示全部楼层
Post by sybaselu;2063582
假设你的数据按照一个item为4个字节格式存放到NAND flash中某个block中,如果从block中的
某个page中读到buffer中

  1. self->read_page(buffer);
复制代码

如果buffer不是4字节对齐的,那么从buffer中就不能完整的读取任一个item


恩,buffer和item应该采取一样的字节处理方式。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表