Блокированные операции и выравнивание с _aligned_malloc - PullRequest
0 голосов
/ 02 мая 2018

Я обеспокоен выравниванием и 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 не нужна. Может кто-нибудь уточнить, пожалуйста?

1 Ответ

0 голосов
/ 02 мая 2018

Если ваши структуры выровнены, что является значением по умолчанию, то каждый элемент будет выровнен в соответствии с типом элемента.

Что касается malloc, то документация для MSVC объясняет, что на 32 мишенях память выровнена на 8 байтов, на 64-битных мишенях - на 16 байтов. Так что вы можете использовать malloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...