◐ Shell
clean mode source ↗

std::aligned_storage - cppreference.com

De cppreference.com

<metanoindex/>

<tbody> </tbody>

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.

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.

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.

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.

template<std::size_t Len, std::size_t Align>
struct aligned_storage {
    typedef struct {
        alignas(Align) unsigned char data[Len];
    } type;
};

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.

#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:

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.

[edit]

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) [edit]

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) [edit]

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) [edit]