因此,一般来说,如果我在c中声明了一些变量,然后打印出它们的内存地址,有时它们会与声明的顺序不一致。我的讲师似乎暗示这是为了优化代码,但是我看不出这有什么帮助。
我怀疑优化来自于尽可能紧密地对齐数据,但在这里我看到了两个问题。
发布于 2022-05-02 02:36:24
我将从你的第二个问题开始:内存真的是“随机访问”吗?现代硬件中的内存访问是相当复杂的,所以任何简单的答案都必须(过度)简化,但从本质上讲,它是这样的:内存是随机访问,任何内存单元都可以在任何时候读写,但一次只能读或写一个单元。这里的“单位”不仅仅是一个字节;它可能不仅仅是一个“单词”,但重要的是它们是不重叠的。因此,您可以读取任何单元,但您不能读取任何字节序列,除非它们都在同一个单元中。如果字节序列的一部分在一个单元中,其余的在下一个单元中,那么耀必须同时读取这两个单元。因为它是一次一个,这比读一个单元要花费更长的时间。
但这仍然是随机访问。它不像一个旋转的圆盘,在那里你必须等待你想要到达读头的数据。或者磁带驱动器,在获得所需数据之前,您可能需要将磁带卷或倒带相当长的距离。
很久以前,CPU组装字节序列的能力非常有限。例如,它可以在一个四字节字中取前两个字节,也可以取最后两个字节,但不能取中间两个字节。如果您需要中间的两个字节,您必须读取所有四个字节,然后移位和掩码以获得您感兴趣的位。如今,我们知道如何在芯片上获得更多的电路,并且从内存单元复制任何连续的字节通常都是有效的。单位本身也有所扩大。所以对齐不像过去那么重要了。但这仍然很重要,因为读取一个连续两个单元的序列仍然需要两个访问,一个接一个。
而且,并不是所有的CPU都这么灵活。在一些CPU上,内存访问一个字的中间是不可能的,所以对于那些芯片来说,对齐仍然是非常有用的。
现在,对齐是一个相当抽象的词;对于不同的数据大小,具体的实现可能有不同的对齐方式。Abd,这是通常设计的模型编译器。因此,如果一个两个字节的数据可能位于一个四字节单元的开头或结尾,那么它的地址必须是偶数。但是,四字节单位必须有一个地址可以除以四。所以秩序确实会起作用。考虑一个由两个单独的字节组成的数据,一个两个字节的“半字”,一个四字节的单词。如果这些是排列好的字节、半字、字节、字,那就需要12个字节:一个数据字节,一个填充字节,一个半字(甚至对齐),另一个字节,三个字节填充,以及这个单词。如果我们把它们排列成字节、字节、半字节、字,那么就没有填充,数据符合八个字节。
https://stackoverflow.com/questions/72075899
复制相似问题