Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::aligned_storage

      From cppreference.com
      <cpp‎ |types
       
       
      Metaprogramming library
      Type traits
      Type categories
      (C++11)
      (C++11)(DR*)
      (C++11)
      (C++11)
      (C++11)
      (C++11)
      (C++11)
      (C++11) 
      Type properties
      (C++11)
      (C++11)
      (C++14)
      (C++11)(deprecated in C++26)
      (C++11)(until C++20*)
      (C++11)(deprecated in C++20)
      (C++11)
      Type trait constants
      Metafunctions
      (C++17)
      Supported operations
      Relationships and property queries
      Type modifications
      Type transformations
      aligned_storage
      (C++11)(deprecated in C++23)
      (C++11)(deprecated in C++23)
      (C++11)
      (C++11)(until C++20*)(C++17)

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

      Provides the nested typetype, which satisfiesTrivialType andStandardLayoutType and suitable for use as uninitialized storage for any object whose size is at mostLen and whosealignment requirement is a divisor ofAlign.

      The default value ofAlign is the most stringent (the largest) alignment requirement for any object whose size is at mostLen. If the default value is not used,Align must be the value ofalignof(T) for some typeT, or the behavior is undefined.

      The behavior is undefined ifLen==0.

      It is implementation-defined whether anyextended alignment is supported.

      If the program adds specializations forstd::aligned_storage, the behavior is undefined.

      Contents

      [edit]Member types

      Name Definition
      type atrivial andstandard-layout type of at least sizeLen with alignment requirementAlign

      [edit]Helper types

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

      [edit]Notes

      The type defined bystd::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 usingplacement new and destroyed with explicit destructor calls.

      [edit]Possible implementation

      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)unsignedchar data[Len];};};

      [edit]Example

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

      Run this code
      #include <cstddef>#include <iostream>#include <new>#include <string>#include <type_traits> 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 storagetemplate<typename ...Args>void emplace_back(Args&&...args){if(m_size>= N)// Possible error handlingthrowstd::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 storageconst T& operator[](std::size_t pos)const{// Note: std::launder is needed after the change of object model in P0137R1return*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 P0137R1std::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';}

      Output:

      ***************

      [edit]See also

      alignas(C++11) specifies that the storage for the variable should be aligned by specific amount
      (specifier)[edit]
      obtains the type's alignment requirements
      (class template)[edit]
      allocates aligned memory
      (function)[edit]
      (since C++11)(deprecated in C++23)
      defines the type suitable for use as uninitialized storage for all given types
      (class template)[edit]
      trivial type with alignment requirement as great as any other scalar type
      (typedef)[edit]
      (C++17)
      pointer optimization barrier
      (function template)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/types/aligned_storage&oldid=168401"

      [8]ページ先頭

      ©2009-2025 Movatter.jp