Я обеспокоен выравниванием и Interlocked
операциями. Снова. В документации по этим функциям говорится, что varaible, который мы хотим обновить, должен быть выровнен по 32-битной границе, и что мы можем достичь этого с помощью _aligned_malloc
. Хорошо.
Итак, у меня есть маленькая тестовая программа:
struct S
{
char c;
long l;
}an_S;
printf("%p, %p", (void*)(&(an_S.c)), (void*)(&(an_S.l)));
В режиме освобождения, выход из этого всегда дает мне адрес long, который составляет 4 байта после адреса символа, поэтому он начинается на 32-битной границе.
1) Это чисто случайно, или я могу положиться на это, следовательно, нет необходимости в _aligned_malloc
?
2) Если мне нужно использовать aligned_malloc
, может кто-нибудь уточнить, как это сделать? Я прочитал документацию по https://msdn.microsoft.com/en-us/library/8z34s9c6.aspx, но, похоже, это не показывает, как присваивать значение памяти, которая «выделяется» ...
3) (Предполагая, что мне нужно aligned_malloc
) Если мне нужен массив структур с длинной переменной, подобной приведенной выше, с которой нужно работать с помощью операции Interlocked, нужно ли добавить какой-то конструктор настроить это или будет более легкий способ сделать это?
4) Я выполнил поиск в Google для _aligned_malloc + interlockedCompareExchange, и он выкупил только 70 результатов. Это говорит мне о том, что либо большая часть кода, который использует InterlockedCompareExchange
(62 800 результатов), неверна, либо _aligned_malloc
не нужна. Может кто-нибудь уточнить, пожалуйста?