5
回答
cpu如何访问内存和cache的?
终于搞明白,存储TCO原来是这样算的>>>   

struct字节对齐的问题,google了一下,其中最多的答案:

为了cpu快速访问内存,以空间换时间。

比如:

arch: amd64 

os: ubuntu12.04 64bit version

struct test{

int a[5];

int *b;

};

未aligned的话,sizeof(struct test) = 28

aligned后,sizeof(struct test) = 32

用做padding的8个byte是否就成了垃圾内存了呢?他们有没有分配数据类型呢?

cpu如何访问内存和cache的?

新手提问,如有不妥,请见谅。

@中山野鬼
举报
onlinedj
发帖于5年前 5回/1K+阅
共有5个答案 最后回答: 5年前

padding只用了4个byte,这四个字节没有用,一般上讲,编译器不会给这块空间赋予其他用途。

pc或者说常见的芯片中,cpu==》cache==》bus==》memory controler==》memory 一般上是这种结构,cache可以有多级,一级一级往外寻找,都mis的话,则cache向总线发起load请求,并把一个cache line的数据放入cache,同时把数据返回给cpu。

引用来自“Rifle”的答案

padding只用了4个byte,这四个字节没有用,一般上讲,编译器不会给这块空间赋予其他用途。

pc或者说常见的芯片中,cpu==》cache==》bus==》memory controler==》memory 一般上是这种结构,cache可以有多级,一级一级往外寻找,都mis的话,则cache向总线发起load请求,并把一个cache line的数据放入cache,同时把数据返回给cpu。

sorry,我笔误,写错了。
另外,cpu读取一次,应该就是一个word吧?即使仅仅是一个char型。
这个byte alignment的准确的定义是什么?是为了和word大小对齐吗?还是说内存地址的对齐。
wiki上写的A memory address a, is said to be n-byte aligned when n is a power of two and a is a multiple of n bytes
数据结构内部的对齐,是为了数据结构成员内存地址的对齐;只要分配空间的时候按数据结构的最大对齐 对齐分配的地址,那就能保证里面成员的对齐

引用来自“onlinedj”的答案

引用来自“Rifle”的答案

padding只用了4个byte,这四个字节没有用,一般上讲,编译器不会给这块空间赋予其他用途。

pc或者说常见的芯片中,cpu==》cache==》bus==》memory controler==》memory 一般上是这种结构,cache可以有多级,一级一级往外寻找,都mis的话,则cache向总线发起load请求,并把一个cache line的数据放入cache,同时把数据返回给cpu。

sorry,我笔误,写错了。
另外,cpu读取一次,应该就是一个word吧?即使仅仅是一个char型。
这个byte alignment的准确的定义是什么?是为了和word大小对齐吗?还是说内存地址的对齐。
wiki上写的A memory address a, is said to be n-byte aligned when n is a power of two and a is a multiple of n bytes
以ARM为例,读一个char,其实到寄存器后还是用32bit处理的,而读1个char的指令时间跟你读4个char的指令时间一样,这个不光是datasheet里面写的,哥用示波器都量过,这个不信的你也可以去量。而你读4个char那么大的内存的时候也是只占一个寄存器,这时候你说选择哪个更效率,但如果你要4个char的读法就要对齐,如果你分配的空间只有11字节,而你没做对齐处理,读最后的一次时候就会产生一个叫data abort的异常,裸奔的没有写对应的SEH直接就导致复位,如果你做对齐处理11字节就会填一个字节上去,分配空间的时候保证是4的倍数,只用3次读操作就完成你对应的任务,而如果使用单字节操作则要操作11次,你说哪个更效率。

       一些CPU甚至还不支持  不对齐的内存访问呢. CPU位数是怎样的, 它就是怎样工作的. 楼上几位说的已经非常好了.  ps   32位CPU的 对齐就是指内存地址的对齐, 地址的后2位都为0.并不是说4char这个大小就算对齐. 有些geek做法还专门拿后2位存储一些标记.
        举个非常不恰当的例子, 就像货车的大小一样, 既然货车就这么大了, 这次就只装这个椅子,你却嫌浪费, 非要把下一次运的床锯成2半, 硬装进去. 没意义的.

顶部