Каковы ограничения выравнивания стандартного глобального оператора по умолчанию new?
Я работаю над старым кодом, который использует ATLCComBSTR
тип. Я'Я изменяю его так, чтобы он компилировался с использованием Visual C ++ Express Edition, который не поставляется с ATL. Я использовал только очень маленькое подмножествоCComBSTR
Делать это довольно просто.
Однако при распределенииBSTR
Блок памяти, мне нужно заполнить первые четыре байта с префиксом длины 4 байта. Я'Я обеспокоен тем, что если я используюnew char[size]
выражение для выделения памяти для строки, что я буду вызывать ошибки выравнивания из-за выделенногоchar
массив не имеет правильного выравнивания для четырехбайтового префикса.
Есть ли в стандарте что-либо, что указывает, какие требования для выравнивания возвращаются значенияnew
иметь? Все, что я вижу в C ++ 11:
5.3.4 / 1 [expr.new]
Это зависит от реализации, поддерживаются ли переопределенные типы (3.11).
3.11 / 6 [basic.align]
Требование выравнивания для полного типа можно запросить с помощью выражения alignof (5.3.6). Кроме того, типы char, подписанный символ и неподписанный символ должны иметь самое слабое требование выравнивания. [Примечание: это позволяет использовать типы символов в качестве базового типа для выровненной области памяти (7.6.2) .—конечная нота]
Я нахожу это немного запутанным - "слабое требование выравнивания " говорит мненаименее строгое ограничение на выравнивание, но примечание под этим, кажется, указывает на то, что стандарт означает обратное.
Я в безопасности, используяnew char[sizeof(uint32_t) + 2*(length + 1)]
буфер какBSTR
как это?
РЕДАКТИРОВАТЬЯ только что понял, что в этом конкретном случаеBSTR
необходимо использовать SysAllocString для того, чтобы выделить строку в любом случае; но я'меня все еще интересует, нормально ли это использоватьnew
в этом случае.