Распределитель называется оператором new
для того, чтобы выделить пространство является «предполагается возвращать указатели на хранение, которые соответствующим образом выровнены для объектов любого типа с фундаментальным выравниванием » (§ 3.7.4.1/2; цитата из § 5.3.4/11). alignas(64)
, вероятно, не является «фундаментальным выравниванием» для вашего компилятора и среды, поэтому функция распределения не должна его уважать.
Обратите внимание, что функция распределения пропускает только объем запрашиваемого пространства; он не имеет представления о том, какое выравнивание запрашивается. Следовательно, он не может скорректировать свой результат для удовлетворения особых потребностей.
Спецификатор типа alignas
предназначен для работы со статическими и автоматическими объектами. С такими объектами требуемое выравнивание должно соблюдаться, если оно имеет фундаментальное значение, и в идеальном мире компилятор выдаст сообщение об ошибке, если он не может гарантировать, что расширенное выравнивание будет соблюдаться. (Я не думаю, что это обязано сделать это, однако, как gcc, так и clang производят исполняемые файлы, которые segfault, если запрашивается огромное выравнивание стека.)
Две вещи: a) поддержка переопределенных типов зависит от реализации, а b) очень педантично, все, что вы проверяете, является ли * преобразованное значение * делимым. Что касается языка, у вас нет понятия «выравнивание указателя», кроме как с помощью новых функций языка выравнивания. Указатели не являются целыми числами, они только конвертируются в и из целых чисел. –
Обратите внимание, что я не проверяю выравнивание указателя (это будет значение '& p'), я проверяю выравнивание того, на что он указывает. Да, я согласен, я проверяю значение указателя, преобразованного в 'long', но есть ли лучший способ проверить, выполняется ли мой запрос выравнивания? – KnowItAllWannabe
Да, новые языковые функции довольно существенны и могут иметь то, что вам нужно, например. [ 'Станд :: align'] (http://en.cppreference.com/w/cpp/memory/align). До C++ 11 просто * не было * стандартного понятия выровненной памяти, поэтому он был добавлен. Раньше вам приходилось использовать платформенные методы. –