std::aligned_storage
Материал из cppreference.com
|
|
This page has been machine-translated from the English version of the wiki using Google Translate.
The translation may contain errors and awkward wording. Hover over text to see the original version. You can help to fix errors and improve the translation. For instructions click here. |
| Заголовочный файл <type_traits>
|
||
| template< std::size_t Len, std::size_t Align = /*default-alignment*/ > struct aligned_storage; |
(начиная с C++11) | |
Обеспечивает член ЬурейеЕ
type, что POD тип подходит для использования в качестве неинициализированные для хранения любой объект, размер которого не превышает Len и, выравнивание требованием является делителем Align. Значение по умолчанию Align является наиболее строгим (самый большой) требование выравнивания для любого объекта, размер которого не превышает Len.Original:
Provides the member typedef
type, which is a POD type suitable for use as uninitialized storage for any object whose size is at most Len and whose alignment requirement is a divisor of Align. The default value of Align is the most stringent (the largest) alignment requirement for any object whose size is at most Len.The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
Содержание |
[править] Член типов
| Имя
Original: Name The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
Definition |
type
|
POD тип размера
Len с выравниванием Align требования Original: the POD type of size Len with alignment requirement Align The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
[править] Notes
Тип определяется std::aligned_storage может быть использован для создания неинициализированных блоков памяти подходят для хранения объектов данного типа, необязательно соответствие строгим, чем это необходимо, например, в кэш или границы страницы.
Original:
The type defined by std::aligned_storage can be used to create uninitialized memory blocks suitable to hold the objects of given type, optionally aligned stricter than necessary, for example on a cache or page boundary.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
[править] Возможная реализация
Кроме аргумент по умолчанию, aligned_storage выражается в терминах alignas
Original:
Except for default argument, aligned_storage is expressible in terms of alignas:
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
template<std::size_t Len, std::size_t Align> struct aligned_storage { typedef struct { alignas(Align) unsigned char data[Len]; } type; }; |
[править] Пример
Примитивных статический класс вектор, демонстрируя создания, доступа и уничтожения объектов в соответствие хранения
Original:
A primitive static vector class, demonstrating creation, access, and destruction of objects in aligned storage
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
#include <iostream> #include <type_traits> #include <string> template<class T, std::size_t N> class static_vector { // propertly aligned uninitialized storage for N T's typename std::aligned_storage <sizeof(T), std::alignment_of<T>::value>::type data[N]; std::size_t m_size; public: static_vector() : m_size(0) {}; // Create an object in aligned storage template<typename ...Args> void emplace_back(Args&&... args) { new(data+m_size) T(std::forward<Args>(args)...); m_size++; // bounds check omitted } // Access an object in aligned storage const T& operator[](size_t pos) const { return reinterpret_cast<const T&>(data[pos]); } // Delete objects from aligned storage ~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(std::string(5, '*')); v1.emplace_back(std::string(10, '*')); std::cout << v1[0] << '\n' << v1[1] << '\n'; }
Вывод:
***** **********
[править] См. также
| alignas спецификатор | указывает, что для хранения переменной должны быть согласованы конкретные (C++11) сумму
Original: specifies that the storage for the variable should be aligned by specific amount (C++11) The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
| (C++11) |
получает выравнивания типа требований Original: obtains the type's alignment requirements The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (шаблон класса) |
| (C++11) |
определяет тип подходит для использования в качестве неинициализированные для хранения всех данных типов Original: defines the type suitable for use as uninitialized storage for all given types The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (шаблон класса) |
| (C++11) |
POD типа с требованием выравнивания так велика, как любой другой тип скаляра Original: POD type with alignment requirement as great as any other scalar type The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (определение типа) |