Рубин: функциональный
def factorial(n)
return 1 if n == 1
n * factorial(n -1)
end
У вас не может быть массивов размера 0, поэтому для его компиляции требуется 1. Однако в текущей черновой версии спецификации говорится, что такое заполнение не требуется; компилятор должен дополнять структуру до выравнивания.
Обратите также внимание на то, что этот код неверно сформирован, если CACHE_LINE_SIZE
меньше, чем alignof (T)
. Чтобы исправить это, вам, вероятно, следует использовать [[align (CACHE_LINE_SIZE), align (T)]]
, что гарантирует, что меньшее выравнивание никогда не будет выбрано.
Представьте себе
#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
.
Таким образом, выравнивание дает вам отступы. надеялись.
Однако это одна «ошибка» в шаблоне. Рассмотрим этот случай:
#define CACHE_LINE_SIZE 32
sizeof(T) == 32
Здесь мы получаем char pad [1];
. Это означает sizeof (cache_line_storage
. Скорее всего, не то, что вы хотите!
Я думаю, что шаблон нужно немного изменить:
«У вас не может быть массивов размером 0, поэтому для компиляции требуется 1» - GNU C допускает использование массивов с нулевым размером. . См. Также http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html