2014-10-06

C++14の新機能: サイズ付き解放関数

ストレージのサイズを引数で受け取れるグローバルな解放関数のオーバーロードを追加する提案。

これまで、解放関数は、解法すべきストレージのサイズを知ることができなかった。

void operator delete ( void * ptr ) noexcept
{
    // ptrが指し示すストレージのサイズは分からない
}

これは、メモリ管理に、K&Rにも書いてあるような古典的な方法を用いているのならば特に問題にはならない。ストレージのサイズまで管理しているからだ。しかし、メモリ確保のアルゴリズムは常に改良や、新しい方法が研究されている。

中でも、十分に小さいサイズごとに異なるヒープから確保するようなメモリ管理の方法は、最近主流になりつつある。

メモリ管理の方法によっては、解放すべきアドレスだけ渡されて、サイズがわからない場合、まずサイズを特定するために、検索をかけるなどのコストのかかる処理が必要になる。

オブジェクトのサイズは、技術的にはコンパイラーが把握している。しかしこれまで、解放関数にサイズを伝える方法がなかった。

C++14では、サイズを引数に取る解放関数のオーバーロードが追加された。


void operator delete ( void * ptr, std::size_t size ) noexcept
{
    // sizeは解放すべきストレージのサイズ
}

これにより、一部のメモリ管理方法における解放処理が効率的に実装できるようになる。

クラスのメンバーとしては存在した解放関数のオーバーロードを、グローバルな解放関数にも導入したとも言える。

なおこの機能はClang 3.4で実装されている。GCCではまだ実装されていない。

Clang - C++1z, C++14, C++11 and C++98 Status

C++1y/C++14 Support in GCC - GNU Project - Free Software Foundation (FSF)

See Also:

本の虫: C++14の新機能: 2進数リテラル

本の虫: C++14の新機能: decltype(auto)

本の虫: C++14の新機能: 関数の戻り値の型推定

本の虫: C++14の新機能: 初期化lambdaキャプチャー

本の虫: C++14の新機能: 変数テンプレート

本の虫: C++14の新機能: constexpr関数の制限緩和

本の虫: C++14の新機能: メンバー初期化子と初期化リストの組み合わせ

本の虫: C++14の新機能: [[deprecated]] 属性

本の虫: C++14の新機能: 数値区切り

ドワンゴ広告

この記事はドワンゴ勤務中に書かれた。

今日は特に台風とは関係がなく午後に出社した。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

No comments: