Это зависит от того, какое выравнивание вам требуется.Для всего <= to <code>alignof(std::max_align_t), new
работает согласно n3242 3.7.4.1/2:
Возвращаемый указатель должен быть соответствующим образом выровнен, чтобы его можно было преобразовать в указатель любого полноготип объекта с требованием фундаментального выравнивания
std::max_align_t
- это полный тип объекта с самым строгим фундаментальным выравниванием.
Обратите внимание, что выделение массивов char
или unsigned char
, ноnot signed char
имеют другое правило в 5.3.4 / 10:
Для массивов char и unsigned char, разница между результатом выражения new и адресом, возвращаемым функцией распределениядолжно быть целым кратным самого строгого требования фундаментального выравнивания (3.11) любого типа объекта, размер которого не превышает размер создаваемого массива.
Так что new char[1];
может иметь выравнивание1.
Что касается выделения памяти с выравниванием, превышающим alignof(std::max_align_t)
, C ++ 11 не предоставляет прямого способа сделать это.Единственный надежный способ - выделить как минимум size + alignment
байтов и использовать std :: align для получения правильно выровненного расположения в этом буфере.
Это может привести к потере большого количества памяти, поэтомуесли вам нужно их много, вы можете создать распределитель, который выделит достаточно большой кусок для всех них, и использовать для этого std :: align.Затем ваши накладные расходы амортизируются по всем выделениям.
Другой вариант - дождаться http://open -std.org / JTC1 / SC22 / WG21 / docs / paper / 2012 / n3396.htm, чтобы превратить его в стандарт.
Лично я бы просто написал слой абстракции поверх API, предоставляемых ОС для выделения выровненной памяти.