2

如果使用 64 位 UNIX 操作系统,将数组大小定义为 8 的倍数是否有任何优势?我打算使用这个数组从共享内存中加载数据。因此依赖关系可能存在于操作系统和页面大小上。

4

3 回答 3

8

没关系。你的编译器知道它是否想要在那里填充,所以让它决定。不要因为猜测而弄乱你的代码。

首先让您的程序正常工作,然后使用分析器关注性能。

于 2010-10-22T13:32:58.000 回答
2

假设您在堆上动态分配数组,可以公平地假设 malloc 的内部分配算法将对内核的实际内存请求进行一些抽象。也就是说,你的 malloc() 调用和 libc 的 brk()(或 mmap())系统调用之间可能有也可能没有直接关系。

malloc 手册页对此有更多内容。

因此,就内存使用而言,我倾向于建议您是否分配 8 个字节的倍数并不重要,因为 malloc 可能会在您下面做一些不同(且明智)的事情。

就程序性能而言,数据结构在内存中的分配会对缓存性能产生巨大影响。但最终,您将需要分析您的应用程序以查看您是否可以提高其缓存性能。我不相信有一个硬性规定可以让你在编写代码时对此进行优化。

如果您有兴趣了解有关内存和 Linux 的更多信息,Ulrich Drepper 几年前为 LWN 写了一个关于该主题的精彩系列:

http://lwn.net/Articles/250967

于 2010-10-22T15:31:37.223 回答
2

如果您是关于内存访问对齐的,那么内部环境/libc 很重要,如何对齐动态分配。如果其大小对齐,则不能保证某些数组以特定方式对齐。许多分配器返回对齐到某个值的内存块(大约是机器字的 2 倍或 4 倍大小),所以它不是需要对齐的地方。

我只记得几件可能有意义的事情:

  1. 您可能希望使用向量操作和/或展开循环来处理数组,因此可能需要一些填充以使程序不会超出分配的区域。(但是,如果您的矢量引擎需要超出标准 C 实现提供的对齐方式,那么您必须以另一种方式分配内存,而不仅仅是简单的 malloc())。

  2. 大多数内存分配器在分配区域旁边存储服务信息(例如分配的块大小),并且从空闲切出的内存总大小略大。Si 最好分配大小略小​​于某个整数值的区域,以便在某个标准分配块(例如内存页面左右)中密集地打包区域。例如,如果 CPU 有 4k 页,则页可能仅包含 3 1024 字节块,但包含 4 1008 字节 (=1024-8) 块。

  3. 此外,许多内存分配器都有一个块大小阈值,低于这种内存是从堆分配的,但高于它的内存是通过整个硬件页面直接从 OS VM 调度程序获取的,因此在页面边界上对齐。在这种情况下,可能需要将分配大小四舍五入到页面大小以获取整个页面。

可能还有其他一些问题,但我不记得了。

于 2010-10-22T23:35:52.837 回答