代码之家  ›  专栏  ›  技术社区  ›  Rick Jim DeLaHunt

关于内存对齐示例的混淆

  •  1
  • Rick Jim DeLaHunt  · 技术社区  · 6 年前

    在阅读一些关于记忆对齐的帖子时,我有一个问题是关于一个好的答案 What is aligned memory allocation?

    看看他举的例子,

     0 1 2 3 4 5 6 7
    |a|a|b|b|b|b|c|d|  bytes
    |       |       |  words
    

    问题是,在某些CPU架构上,从内存加载4字节整数的指令只在字边界上工作。所以你的程序必须把 b 有单独的指示。

    B ?

    例如,如果我想

     0 1 2 3 4 5 6 7
    |a|a|b|b|b|b|c|d|  bytes
        |       |      a word(assume it's 32 bit, get b directly)
    

    address 2 .

    a

     0 1 2 3 4 5 6 7
    |a|a|b|b|b|b|c|d|  bytes
    |       |          a word
    

    读一个单词从 address 0 获取前2个字节,丢弃后2个字节。

    c d

     0 1 2 3 4 5 6 7
    |a|a|b|b|b|b|c|d|  bytes
            |       |  a word
    

    读一个单词从 address 4 获取最后2个字节,丢弃前2个字节。


    我一定是误会了什么,或者缺乏其他知识,请帮我纠正一下。。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Yunnosch    6 年前

    为什么不能直接读取包含b的4个字节(一个字,假设32位)
    你刚才引用的答案就在上面。关键是“在文字上” 边界 ". 这与“字数大小”不同。也就是说,这些CPU只能从 N*wordwidth ,不是来自 N*wordwidth+2 .

    从你的评论中提取你的措辞,是的。
    这些CPU只能读取地址0、4、8、12、16等。
    例如,地址0-3中有一个单词,地址4-7中有一个单词。 (请注意,添加了12。)