2017-09-27 62 views
-1

我想知道哪一个更好,2个数组或者具有2个数据成员的结构的数组。 我想要关于以下方面的见解:2数组vs 2个数据成员的结构阵列

  1. struct是一种包含额外内存的包装吗?我知道结构中的填充符合词的限制。
  2. 如果我想同时访问两个数据成员,哪一个更快?我认为它的结构阵列。
  3. 由于结构填充的可能性,一个结构的数组可能会占用比2个数组更多的内存。

在一般情况下和语言特定的答案都是受欢迎的。

请不要建议看看SoA和AoS问题,已经这样做了。

回答

1

这完全取决于你想要做什么,既不是答案总是“正确”。

  1. 外特定于编译器的填充物,除非你把它虚拟的结构不占用任何额外的内存,在这种情况下,它会得到一个虚函数表指针,但仅此而已。

  2. 只要您的计算机具有足够大的缓存以容纳两页(通常每个4KB,但检查特定的CPU),则无关紧要,您应该选择哪一个更容易工作与你的代码更有意义。结构数组将使用一个页面,并导致每加载一个4KB的结构会导致一次高速缓存未命中,而值的数组将加载两个导致两次高速缓存未命中的页面。如果你碰巧正在使用一个只允许一个缓存用于你的程序数据的dinky缓存,那么是的,使用一个结构数组将会快得多,因为替代方法会导致每次读取都会导致缓存未命中。

  3. 与#1相同的答案 - 数组永远不会有自己的填充,但是一个结构体可能会使用编译器内置的填充。

虽然struct padding完全取决于你的编译器,它可能有标志来打开或关闭它或设置最大焊盘尺寸或其他。检查对象数组的原始数据以查看它们是否有填充,如果有,请在需要时使用编译器了解如何在编译器中关闭该数据。

你正在使用什么编译器,你想用你的项目做什么?

也许更重要的是:你的项目在哪个阶段,你是否遇到过速度问题?预先优化是所有弊端的根源,而且你可能会浪费你的时间担心这个问题。

+0

这只是一个想法,我只是想解决一个编程问题。 –

0
  1. 填充结构以允许CPU对成员进行最佳访问,以便它们可能需要更多内存。这些字段可能已经对齐,因此不需要填充。所以它们不是一个包装,因为它们总是包装着数据。考虑编译器的结构填充/优化调整。
  2. 由于整个结构可能适合缓存在一起,结构将会更快。如果您有单独的列表,它们可能会脱离缓存。
  3. 如果填充,是的。

不要忘记保持数据在一起的一个重要原因:代码可读性。如果您打算独立处理每个字段的不同线程。如果您使用阵列,可能会提高性能。