std::aligned_storage
| Определён в заголовочном файле <type_traits>
|
||
| template< std::size_t Len, std::size_t Align = /*выравнивание по умолчанию*/ > struct aligned_storage; |
(начиная с C++11) | |
Предоставляет определение для типа в члене type, который удовлетворяет концепту PODType (простому типу данных) и подходим для неинициализированого хранилища для всех объектов, чей размер не больше Len и чьё выравнивание является делителем Align.
Значение по умолчанию для Align является наиболее жёсткое (широкое) выравнивание для любых типов, чей размер не более Len. Если значение по умолчанию не используется, то Align должно быть значением alignof(T) для некоторого типа T, иначе поведение будет не определено.
Поведение будет не определено, если Len == 0.
Содержание |
[править] Типы-члены
| Имя | Определение |
type
|
Простой тип данных, размер которого как минимум Len с выравниванием Align
|
[править] Вспомогательный тип
| template< std::size_t Len, std::size_t Align = /*выравнивание по умолчанию*/ > using aligned_storage_t = typename aligned_storage<Len, Align>::type; |
(начиная с C++14) | |
[править] Примечание
Тип, определённый с помощью std::aligned_storage<>::type, может быть использован для выделения неинициализированного блока памяти, который может использован для хранения объектов данного типа, с возможностью размещенные шире, чем их естественное выравнивание, например для кеширования или выравнивания по границам страницы памяти.
Также как и для любой другой неинициализированной памяти, объекты создаются с помощью размещающего new, а удаляются с помощью явного вызова деструктора.
[править] Возможная реализация
Исключая аргумент по умолчанию, aligned_storage представима в терминах alignas:
template<std::size_t Len, std::size_t Align /* выравнивание по умолчанию не реализовано */> struct aligned_storage { typedef struct { alignas(Align) unsigned char data[Len]; } type; }; |
[править] Пример
Простейший статический класс для вектора, который демонстрирует создание, доступ и удаление объектов из выровненной памяти
#include <iostream> #include <type_traits> #include <string> template<class T, std::size_t N> class static_vector { // Правильно выравненная память для N T's typename std::aligned_storage<sizeof(T), alignof(T)>::type data[N]; std::size_t m_size = 0; public: // Создание объекта в выравненной памяти template<typename ...Args> void emplace_back(Args&&... args) { if( m_size >= N ) // Возможная проверка ошибок throw std::bad_alloc{}; new(data+m_size) T(std::forward<Args>(args)...); ++m_size; } // Доступ к элементам к выравненной памяти const T& operator[](std::size_t pos) const { return *reinterpret_cast<const T*>(data+pos); } // Удаляет объекты из выровненной памяти ~static_vector() { for(std::size_t pos = 0; pos < m_size; ++pos) { reinterpret_cast<const T*>(data+pos)->~T(); } } }; int main() { static_vector<std::string, 10> v1; v1.emplace_back(5, '*'); v1.emplace_back(10, '*'); std::cout << v1[0] << '\n' << v1[1] << '\n'; }
Вывод:
***** **********
[править] См. также
| alignas спецификатор | указывает, что для хранения переменной должны быть согласованы конкретные (C++11) сумму
Оригинал: specifies that the storage for the variable should be aligned by specific amount (C++11) Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
| (C++11) |
Получает требования к выравниванию типа (шаблон класса) |
| (C++11) |
Определяет тип, подходящий для использования в качестве неинициализированного хранилища для всех данных типов (шаблон класса) |
| (C++11) |
POD типа с требованием выравнивания так велика, как любой другой тип скаляра Оригинал: POD type with alignment requirement as great as any other scalar type Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (определение типа) |

