2010-12-29 2 views
5

Я пытался поднять голову над добавлением TR1, известным как aligned_storage. При чтении следующих документов N2165, N3190 и N2140 Я не могу на всю жизнь видеть, что в нем четко описывается структура стека или кучи используемой памяти.Выделение Цель std :: aligned_storage (стек или куча?)

Я рассмотрел реализацию, предоставленную msvc2010, boost и gcc, все они предоставляют решение на основе стека, основанное на использовании объединения.

Короче:

  • ли тип памяти (стек или куча), используемое aligned_storage реализации определяется или он всегда хотел быть складывают на основе?

  • and, Что такое конкретный документ, который определяет/определяет это?

Примечание: В MSVC10, следующее определение типа aligned_storage, в этом случае, если aligned_storage является автоматической переменной данных (_Val, _Pad) создается на стеке:

template<class _Ty, size_t _Len> 
union _Align_type 
{ 
    // union with size _Len bytes and alignment of _Ty 
    _Ty _Val; 
    char _Pad[_Len]; 
}; 

Примечание: Это НЕ тривиальный вопрос. Перед отправкой ответа попробуйте разобраться в этом вопросе.

ответ

12

std::aligned_storage<Len, Align> просто объявляет член typedef (type).

Член ЬурейеГо type должен быть типом СТРУЧКА подходит для использования в качестве неинициализированного хранения для любого объекта, размер которого составляет не более Len и выравнивание которого является делителем Align

(Это из последних C++ 0x draft, N3225, 20.7.6.6 Таблица 53, но язык в спецификации TR1, N1836, фактически тот же, что и в C++ 0x параметр шаблона Align имеет в качестве аргумента по умолчанию максимальное значение выравнивания.)

std::aligned_storage не выделяет никакой памяти. Вы можете создать объект типа std::aligned_storage<Len, Align>::type и переинтерпретировать этот объект как объект любого типа, соответствующий требованиям, указанным выше.

+2

Я не уверен, что ответ может стать лучше этого. Какой смысл, если бы данные были динамически распределены в 'type'? Как это может быть связано с выравниванием? – icecrime

+2

@ Zenikoder - просто прочитайте цитату из стандарта снова. И снова, если нужно. :) 'std :: aligned_storage <...> :: type' определяет тип POD с запрошенным выравниванием. Вы можете выделить хранилище для этого типа в стеке или в куче, это не имеет значения. – atzz

+0

@ Zenikoder - это не реализация. Он определен пользователем. Заявление, приведенное Джеймсом, объясняет все достаточно ясно. – atzz

0

Обычно вам не нужно выровнять материал в куче, поскольку любое распределение (new/malloc) возвращает память по адресу, который выровнен по любому типу.

+3

Это не совсем так. Если вы используете инструкцию SIMD, вам иногда необходимо, чтобы данные выровняли границы 16 байтов, а new/malloc не предоставляли такую ​​гарантию. Например, libc malloc возвращает память, выровненную на границе 8 байтов. См. Функции 'posix_memalign' в Linux или' _aligned_malloc' в Windows. –

+1

Мне удалось выделить выровненную память в куче, используя std :: align, которая еще не находится в gcc4.8, поэтому я использую эту реализацию: http://code.google.com/p/c-plus/source /browse/src/util.h#57 –