std::aligned_storage
Aus cppreference.com
<metanoindex/>
<tbody> </tbody>| definiert in Header <type_traits>
|
||
template< std::size_t Len, std::size_t Align = /*default-alignment*/ > struct aligned_storage; |
(seit C++11) | |
Stellt das Mitglied typedef
type, das ein POD-Typ für die Verwendung als Speicher für jeden initialisierten Objekt, dessen Größe höchstens Len und deren Ausrichtung Anforderung ist ein Teiler von Align ist. Der Standardwert von Align ist die höchste (die größte) Angleichung Voraussetzung für jedes Objekt, dessen Größe höchstens 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.
Mitglied Typen
Name
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
|
Die POD-Typ der Größe
Len mit Angleichung Voraussetzung 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
Der Typ von std::aligned_storage definiert verwendet werden, um initialisierte Speicherblöcke geeignet sind, die Objekte des gegebenen Typs zu halten, gegebenenfalls strenger als notwendig ausgerichtet sind, zum Beispiel auf einem Cache oder Seitenbegrenzung zu erzeugen .
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.
Mögliche Implementierung
Außer Standard-Argument ist aligned_storage ausdrückbar der 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;
};
|
Beispiel
Eine primitive statische Vektor Klasse demonstriert Erstellung, Zugriff und Zerstörung von Objekten in ausgerichtete Lagerung
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';
}
Output:
*****
**********
