• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function
    <memory_resource>

    std::pmr::polymorphic_allocator::allocate_bytes

    [[nodiscard]]
    void* allocate_bytes(size_t nbytes,
                         size_t alignment = alignof(max_align_t)); // (1) C++20
    void* allocate_bytes(size_t nbytes,
                         size_t alignment = alignof(max_align_t)); // (1) C++26
    

    概要

    指定されたバイト数とアライメントでメモリを確保する。

    事前条件

    alignmentは2の累乗であること。

    引数

    • nbytes -- 確保したい領域のサイズ(バイト数)
    • alignment -- 確保領域へのアライメント要求

    効果

    利用するmemory_resourceのポインタをmemory_rsrcというメンバに保持しているとすると、以下と等価。

    return memory_rsrc->allocate(nbytes, alignment);
    

    戻り値

    確保した領域の先頭へのポインタ。

    例外

    要求されたアライメントでサイズnbytesのメモリを確保できない場合、例外が送出される。

    #include <iostream>
    #include <memory_resource>
    
    int main() {
      constexpr int N = 10;
    
      std::pmr::polymorphic_allocator<> alloc{};
    
      //int型10個分の領域をデフォルトアライメントで確保
      void* vp = alloc.allocate_bytes(sizeof(int) * N, alignof(int));
    
      //確保したメモリ領域へのポインタを所望の型のものにキャスト
      int* p = static_cast<int*>(vp);
    
      //確保したメモリ領域にintのオブジェクトを構築(コンストラクタ呼び出し)
      for (int i = 0; i < N; ++i) {
        alloc.construct(p+i, i);
      }
    
    
      std::cout << "address : " << vp << std::endl;
    
      for (int i = 0; i < N; ++i) {
        std::cout << p[i] << "\n";
      }
    
    
      //領域上のオブジェクトを破棄(デストラクタ呼び出し)
      for (int i = 0; i < N; ++i) {
        alloc.destroy(p+i);
      }
    
      //確保したメモリ領域を解放
      alloc.deallocate_bytes(vp, sizeof(int) * N, alignof(int));
    }
    

    出力例(GCC9.2)

    address : 0x1c38150
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    

    バージョン

    言語

    • C++20

    処理系

    関連項目

    参照