std::aligned_storage
Da 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. |
Definido no cabeçalho <type_traits>
|
||
template< std::size_t Len, std::size_t Align = /*default-alignment*/ > struct aligned_storage; |
(desde C++11) | |
Fornece a
type
membro typedef, que é um tipo POD adequado para utilização como armazenamento não inicializada para qualquer objecto cujo tamanho é no máximo Len
e cujo alinhamento requisito é um divisor de Align
. O valor padrão de Align
é a exigência de alinhamento mais rigoroso (maior) para qualquer objeto cujo tamanho é no máximo 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.
Índice |
[editar] Tipos de membro
Nome
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
|
o tipo de POD
Len tamanho com Align exigência de alinhamento 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. |
[editar] Notas
O tipo definido por std::aligned_storage pode ser usado para criar blocos de memória não inicializadas adequados para armazenar os objetos de determinado tipo, opcionalmente alinhados mais rigorosa do que o necessário, por exemplo, em um cache ou limite de página.
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.
[editar] Possível implementação
Com exceção de argumento padrão, aligned_storage é expresso em termos de 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; }; |
[editar] Exemplo
Uma classe vetor primitivo estática, demonstrando criação, acesso e destruição de objetos no armazenamento alinhados
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'; }
Saída:
***** **********
[editar] Veja também
alignas especificador | especifica que o armazenamento para a variável devem ser alinhados por (C++11) quantidade específica
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) |
obtém requisitos do tipo de alinhamento 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. (modelo de classe) |
(C++11) |
define o tipo adequado para utilização como armazenamento não inicializados para todos os tipos de dados 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. (modelo de classe) |
(C++11) |
Tipo POD com exigência de alinhamento tão grande quanto qualquer outro tipo escalar 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. (typedef) |