Выравнивание Строки кэша (Разъяснение потребности по поводу статьи)

Рубин: функциональный

def factorial(n)
    return 1 if n == 1
    n * factorial(n -1)
end
9
задан quark 16 November 2009 в 21:54
поделиться

3 ответа

У вас не может быть массивов размера 0, поэтому для его компиляции требуется 1. Однако в текущей черновой версии спецификации говорится, что такое заполнение не требуется; компилятор должен дополнять структуру до выравнивания.

Обратите также внимание на то, что этот код неверно сформирован, если CACHE_LINE_SIZE меньше, чем alignof (T) . Чтобы исправить это, вам, вероятно, следует использовать [[align (CACHE_LINE_SIZE), align (T)]] , что гарантирует, что меньшее выравнивание никогда не будет выбрано.

7
ответ дан 4 December 2019 в 21:10
поделиться

Представьте себе

#define CACHE_LINE_SIZE 32
sizeof(T) == 48

Теперь рассмотрим, как работает [[align (CACHE_LINE_SIZE)]] . например:

[[ align(32) ]] Foo foo;

Это заставит sizeof (Foo) == 32n для некоторого n . т.е. align () при необходимости выполнит для вас заполнение, чтобы такие вещи, как Foo foo [10]; , чтобы каждый foo [i] был выровнен по запросу.

Итак, в нашем случае с sizeof (T) == 48 , это означает sizeof (cache_line_storage ) == 64 .

Таким образом, выравнивание дает вам отступы. надеялись.

Однако это одна «ошибка» в шаблоне. Рассмотрим этот случай:

#define CACHE_LINE_SIZE 32
sizeof(T) == 32

Здесь мы получаем char pad [1]; . Это означает sizeof (cache_line_storage ) == 64 . Скорее всего, не то, что вы хотите!

Я думаю, что шаблон нужно немного изменить:

3
ответ дан 4 December 2019 в 21:10
поделиться

«У вас не может быть массивов размером 0, поэтому для компиляции требуется 1» - GNU C допускает использование массивов с нулевым размером. . См. Также http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html

0
ответ дан 4 December 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: