gpt4 book ai didi

computer-science - 为什么即使是大端计算机也从低位内存读取到高位内存?对于 big-endianness 相反可能更优化

转载 作者:行者123 更新时间:2023-12-02 06:46:53 24 4
gpt4 key购买 nike

我在 wiki 中读到了字节​​序并尝试搜索我的问题,发现该帖子 Does the endianness affect how structure members are stored into the memory其中解释了字节顺序不会影响 C 的内存中结构成员的顺序(从低到高)。

同样在 wiki 中:

The little-endian system has the property that the same value can be read from memory at different lengths without using different addresses

但这只是当我们从小地址读到大地址时。

我想知道在哪里(什么架构/语言)使用从高位(明确:大地址)到低位的内存序列?这将使 big-endianness 具有在上面引用的 wiki 中正确提到的相同的好处。

也例如在类似于 C 的语言中,它可能意味着 malloc 返回最大地址,程序将通过执行 received_address-- 而不是 ++ 来填充内存(希望我说清楚了)

我无法通过网络搜索找到为什么计算机开发没有走那条路(从大地址到小地址读取内存)(因为如果 wiki 中的那个短语是正确的,它确实没有走)。

最佳答案

通常情况下,单词中的字节顺序与您访问单词的顺序之间的联系为零。促使选择单词中的字节顺序的推理/好处等根本不适用于索引数组的方式。

例如Intel 发明(或至少使用)little-endian 使 8008 更像一个 CPU,带有它希望与之兼容的位串行 ALU 和移位寄存器存储。 ( Why is x86 little endian? 另见 https://retrocomputing.stackexchange.com/questions/2008/were-people-building-cpus-out-of-ttl-logic-prior-to-the-4004-8080-and-the-6800/8664#8664 显然 Datapoint 希望 Intel 构建一个位串行机器,并且以 LSB 优先顺序存储跳转目标是为了让他们高兴,即使 CPU 最终不是位-连续剧。)

当对单独的单词进行单独访问时,这显然没有任何意义。

维基百科引用的“优势”更像是一个“有趣的事实”,而不是真正有值(value)的东西。将 ISA 弯曲变形以得到它是没有意义的,因为它会使其他任何东西变得更糟或更昂贵,甚至让人类更难使用。仅当您构建的 CPU 一次解码一个字节的指令时,并且如果解码无论如何都将是多周期的,则可以将提取与解码重叠(因为进位从低位传播到高位)。

虽然您可能对构建第一个小端 CPU 提出了相同的论点,但当时人们认为大端是“自然的”。


您提出的设计将使字的地址成为其​​最低有效字节的地址。(我认为)。

这更像是 little-endian,具有关于内存寻址反转/翻转/否定的一切

否则,它只是一个软件约定,返回一个指向分配的尾数的指针,这显然不太方便,因为它需要一个偏移量才能使用。但是如果你返回一个指向分配的最后一个字的指针,你怎么知道调用者想把它当作字而不是字节来对待呢? malloc返回 void* .如果返回指向分配的最后一个字节的指针,则必须进行数学运算才能获得指向最后一个字的指针。

因此,除非您执行反向小端,否则返回指向第一个(或唯一)字节/字/双字/ float /已分配缓冲区的任何指针以外的任何内容显然更糟,特别是给定一个像 malloc 这样的分配器它不知道其调用者将用于访问内存的元素大小。


我认为 C 的机器模型与反向小端系统几乎不兼容。你想要 arr[i]意思是*(arr - i)而不是 arr + i , 索引寻址模式可能支持 -而不是 + .然后 arr[i]可以透明地使用 malloc返回指向末尾的指针。但是 C 定义了 x[y]*(x+y) 方面, 并且有代码会注意到差异和中断。

否则,如果寻址仍能正常工作,您是否希望将负索引向上计数为零以从低地址循环到高地址?

如果您的“正常”用例是 for(i=0; i<n ; i++)并访问 arr[-i] ,它可以像在普通机器上一样工作。但是你需要修改你的 C 源代码才能在这样的机器上工作。

或者,如果您想编写类似 for(i=0 ; i>=-n ; i--) 的循环那么你最大的索引变成负数,而你的大小仍然是正数。这看起来更令人困惑。

(@Alexei Martianov 的回答提出了一个很好的观点:CPU 可能需要在地址生成单元和其他普通 CPU 使用加法器的地方使用二进制减法器。我认为减法器通常需要稍微硬件多于加法器。这在主 ALU 之外,当然必须能够同时支持有效的整数数学运算。)

关于computer-science - 为什么即使是大端计算机也从低位内存读取到高位内存?对于 big-endianness 相反可能更优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58151720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com