В документации для _alloca()
написано здесь:
Подпрограмма _alloca возвращает пустой указатель на выделенное пространство, которое гарантированно будет соответствующим образом выровнено для хранения любого типа объекта.
Однако здесь говорится:
_alloca должен быть выровнен по 16 байт и дополнительно требуется для использования указателя кадра.
Похоже, что в первой ссылке они забыли о 32-байтовых выровненных типах AVX / AVX2, таких как __m256d
.
Еще меня смущает то, что на первой странице говорится, что _alloca()
устарел, а вместо этого предлагается использовать функцию, которая может выделять память из кучи, а не из стека (что недопустимо в моем многопоточном приложении).
Так может ли кто-нибудь указать мне, есть ли какой-нибудь современный (возможно, новый стандарт C / C ++?) Способ выровненного распределения памяти стека?
Уточнение 1. Не предоставляйте решения, требующие, чтобы размер массива был постоянным во время компиляции. Моя функция выделяет переменное количество элементов массива в зависимости от значения параметра времени выполнения.
_alloca
не является их частью. - person   schedule 22.10.2017alloca
выровняйте выделение на 16 байт. если вам нужно другое выравнивание - выделите больше памяти и выровняйте себя - person RbMm   schedule 22.10.2017std::aligned_storage
для ваших нужд? Вы можете указать выравнивание в качестве второго параметра шаблона, и оно поступает из стека, учитывая пример реализации, в которой используетсяalignas
. en.cppreference.com/w/cpp/types/aligned_storage - person Joe   schedule 22.10.2017alignof(__m256d)
для людей, у которых нет расширений вашей платформы? - person Kerrek SB   schedule 22.10.2017cb
-PBYTE pb = (PBYTE)alloca(31 + cb); pb = (PBYTE)((ULONG_PTR)(pb + 31) & ~31);
- person RbMm   schedule 23.10.2017std::cout << alignof(__m256d) << std::endl;
, 32. - person Serge Rogatch   schedule 23.10.2017std::aligned_storage
не кажется подходящим, потому что он требует, чтобы длина массива была постоянной во время компиляции. - person Serge Rogatch   schedule 23.10.2017max_align_t
дает только самое большое нерасширенное выравнивание, поэтому фраза для любого типа не совсем точна. Вы можете использовать вспомогательную функциюstd::align
для выравнивания памяти вручную. - person Kerrek SB   schedule 23.10.2017