【发布时间】:2017-05-24 17:27:49
【问题描述】:
有没有办法强制数组的每个元素缓存对齐,而不必在每个数组元素的末尾或类型本身添加填充?
如果我有:
struct foo {
struct bar bar;
};
struct foo fooarray[100] __attribute__((aligned(CACHE_LINE_SIZE)));
这将声明一个数组 fooarray,其中数组本身是缓存对齐的,但各个元素不是(因此fooarray[1] 不在缓存行上)。该结构本身在数组之外使用,因此我不希望自动为其添加填充。同时,当我访问数组的元素时,我不想做任何额外的转换/取消引用......
【问题讨论】:
-
你只关心gcc? (或者关于特定平台上的 gcc)?因为没有便携式方法可以做到这一点。
-
我认为没有填充是不可能的。“自动”或“手动”。
-
假设
CACHE_LINE_SIZE是已知的(我主要对 gcc 感兴趣,但总的来说很好奇......) -
好的。通常,不能保证您可以使用对齐声明来强制进行比最严格对齐的基本类型更严格的对齐。 GCC 允许更严格的对齐方式,但它们不可移植。如果您希望每个元素都对齐,请将元素声明为对齐,而不是容器。