【问题标题】:2 Arrays vs Array of Structures with 2 data members2 个数组与具有 2 个数据成员的结构数组
【发布时间】:2018-03-08 09:31:12
【问题描述】:
我想知道哪个更好,2 个数组或具有 2 个数据成员的结构的数组。
我想了解以下方面:
- struct 是一种需要额外内存的包装器吗?我知道结构中的填充以适应字数限制。
- 如果我想同时访问两个数据成员,哪个更快?我认为它的结构数组。
- 由于结构填充的可能性,一个结构的数组是否可能比 2 个数组占用更多的内存。
欢迎提供一般上下文和特定语言的答案。
请不要建议查看 SoA 与 AoS 的问题,已经这样做了。
【问题讨论】:
标签:
c++
arrays
performance
memory
structure
【解决方案1】:
- 结构被填充以允许 CPU 对成员进行最佳访问,因此它们可能会占用更多内存。这些字段可能已经对齐,因此不需要填充。所以它们不是包装器,因为它们总是被数据包装。想想编译器的结构填充/优化调整。
- 结构在一起会更快,因为整个结构很可能一起放入缓存中。如果您有单独的列表,它们可能会从缓存中掉出来。
- 如果有填充,是的。
不要忘记将数据保存在一起的一个重要原因:代码可读性。如果您打算独立处理每个字段,请使用不同的线程。如果您使用数组,您可能会获得性能提升。
【解决方案2】:
这完全取决于你想要做什么,没有一个答案总是“正确的”。
在特定于编译器的填充之外,结构不会占用任何额外内存,除非您将其设为虚拟,在这种情况下,它将获得一个 vtable 指针,仅此而已。
只要您的目标机器具有足够大的高速缓存以容纳两个页面(通常每个 4KB,但请检查您的特定 CPU),这并不重要,您应该选择更容易在您的代码中使用并使其更有意义。结构数组将使用一个页面,并且每加载 4KB 的结构就会导致一次缓存未命中,而值数组将加载两个页面,导致两次缓存未命中的频率减半。如果您碰巧正在使用一个只允许一个缓存用于您的程序数据的极小缓存,那么是的,使用结构数组会快得多,因为替代方案会导致每次读取时缓存未命中。
与 #1 的答案相同 - 数组永远不会有自己的填充,但编译器可能会在结构中内置填充。
虽然结构填充完全取决于您的编译器,它可能具有打开或关闭它的标志或设置最大填充大小或其他任何东西。检查对象数组的原始数据以查看它们是否有填充,如果有,如果需要该内存,请了解如何在编译器中将其关闭。
你正在使用什么编译器,你想对你的项目做什么?
也许更重要的是:您的项目处于哪个阶段,您是否已经遇到速度问题?预优化是万恶之源,您可能会浪费时间担心这个问题。