1

如果我有一些错误,请提前道歉。如果不太具有破坏性,我可能会稍后进行编辑以更正。

据我了解,当在相邻内存中声明多个变量时,在非常低的级别上,会创建封装多个字节的寄存器,通常为 1、2、4 或 8。这允许这些位范围进行二进制旋转,如以及被处理器视为数字,因此通过简单的数学(例如加,减,乘和除)发生变异。

可能存在不重叠这些范围的抽象原因,但由于许多语言认为指令以编码器将意识到的明确定义的顺序顺序发生,是否有任何性能原因不重叠分配内存的相邻字节中的一个或多个?

例如,在分配的内存块中,每个位都从 0 开始。字节 0 到 3 可以用作 int,以及字节 1 到 4。第一个可以设置为在第二个范围乘以之前的值3.

如果有性能原因不这样做,那么它们是否通过否则必须将值复制进出全新的变量并执行更复杂的过程来实现某些算法来克服,否则这些算法可以在非常低的水平上完成?

4

1 回答 1

2

当它在汇编中完成时,这个技巧并没有错:优化器经常利用知道整数的各个部分在哪里来节省 CPU 周期并减少代码的大小。例如,当一个 32 位整数变量被初始化为一个仅适合 16 位的值时,优化编译器会将在内存中存储 32 位值的指令替换为将 16 位值存储到变量的低位,并清除高 16 位。此外,许多优化器会走得更远:如果一个常数可以被 2^16 整除,它们会将除以 2^16 的值存储到高 16 位,并清除低 16 位。

一些架构将此类操作限制在某些属性的地址,例如,要求所有 4 字节内存加载/存储指令在可被 4 整除的地址处完成。这些限制可能会降低部分值写入技巧的适用性。

于 2012-02-18T14:41:05.733 回答