GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::aligned_storage(3) C++ Standard Libary std::aligned_storage(3)

std::aligned_storage - std::aligned_storage


Defined in header <type_traits>
template< std::size_t Len, std::size_t Align = (since C++11)
/*default-alignment*/ > (deprecated in C++23)
struct aligned_storage;


Provides the nested type type, which is a trivial standard-layout 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. If the default value is not used, Align
must be the value of alignof(T) for some type T, or the behavior is undefined.


The behavior is undefined if Len == 0.


It is implementation-defined whether any extended alignment is supported.


The behavior of a program that adds specializations for aligned_storage is
undefined.


Name Definition
type a trivial and standard-layout type of at least size Len with alignment
requirement Align


template< std::size_t Len, std::size_t Align =
/*default-alignment*/ > (since C++14)
using aligned_storage_t = typename aligned_storage<Len, (deprecated in C++23)
Align>::type;


The type defined by std::aligned_storage<>::type can be used to create uninitialized
memory blocks suitable to hold the objects of given type, optionally aligned
stricter than their natural alignment requirement, for example on a cache or page
boundary.


As with any other uninitialized storage, the objects are created using placement new
and destroyed with explicit destructor calls.


Except for default argument, aligned_storage is expressible in terms of alignas:


template<std::size_t Len, std::size_t Align = /* default alignment not implemented */>
struct aligned_storage {
struct type {
alignas(Align) unsigned char data[Len];
};
};


A primitive static vector class, demonstrating creation, access, and destruction of
objects in aligned storage

// Run this code


#include <new>
#include <iostream>
#include <type_traits>
#include <string>


template<class T, std::size_t N>
class static_vector
{
// properly aligned uninitialized storage for N T's
std::aligned_storage_t<sizeof(T), alignof(T)> data[N];
std::size_t m_size = 0;


public:
// Create an object in aligned storage
template<typename ...Args> void emplace_back(Args&&... args)
{
if( m_size >= N ) // possible error handling
throw std::bad_alloc{};


// construct value in memory of aligned storage
// using inplace operator new
::new(&data[m_size]) T(std::forward<Args>(args)...);
++m_size;
}


// Access an object in aligned storage
const T& operator[](std::size_t pos) const
{
// Note: std::launder is needed after the change of object model in P0137R1
return *std::launder(reinterpret_cast<const T*>(&data[pos]));
}


// Destroy objects from aligned storage
~static_vector()
{
for(std::size_t pos = 0; pos < m_size; ++pos) {
// Note: std::launder is needed after the change of object model in P0137R1
std::destroy_at(std::launder(reinterpret_cast<T*>(&data[pos])));
}
}
};


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 specifier(C++11) specifies that the storage for the variable should be
aligned by specific amount
alignment_of obtains the type's alignment requirements
(C++11) (class template)
aligned_alloc allocates aligned memory
(C++17) (function)
aligned_union defines the type suitable for use as uninitialized
(C++11)(deprecated in C++23) storage for all given types
(class template)
max_align_t trivial type with alignment requirement as great as any
(C++11) other scalar type
(typedef)
launder pointer optimization barrier
(C++17) (function template)

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.