custom allocator難しすぎワロタ

昨日の記事でx86用のコードでheapから(newで)確保されたメモリのアライメントが16バイト境界になってなくて大変だという話を書いたのだが、その続き。

std::stack<StateInfo>である。StateInfoはstructで、alignas(16)がついている(or メンバーの定義にalignas(16)がついているものがある)とする。

ここにpush()ときに内部的にヒープからメモリが割り当てられるようで、これもalignasを無視しやがるので、どうにかしたい。

しかし、std::stackのカスタムアロケーターを書くの、難しくてさっぱりわからん。std::stackって、内部的にはstd::dequeなんだっけ?てか、こんなalignasを無視するような糞コンテナ要らないんだけど…。調べる気にもならん…。

push()とtop()さえあればいいので、とりあえず以下のようにしておいたのだが…。

「それ、XXX使えば1行で書けるよ!」というようなエクセレントなコメント、お待ちしております。

追記 2020/05/30

C++17では、newのときにメンバ変数のクラス定義につけてるalignasが考慮されるようになったので、本記事の処理は、不要になりました。

custom allocator難しすぎワロタ」への9件のフィードバック

    • おお!ありがとうございます。custom allocatorの書き方わからなかったので参考になりました。しかし行数結構長くなりますねー。std::allocator継承してallocateのところだけ書き換えるようなことは出来そうもないし…。困ったもんです。

      • カスタムアロケータ(とカスタムイテレータ)は要求される typedef, メンバ関数、比較演算子などを全て用意しないといけないのでどうしても長くなってしまうんですよね。

        標準で個別のメンバのみカスタム可能なアロケータが入ってくれると嬉しいのですが…

  1. すいません、使用例の部分がエスケープされてしまいました。
    redboltz さんがhttp://melpon.org/wandbox/permlink/B9O8ZOp07dLkxyAy
    で紹介されているコードのアロケータの部分を置き変えるだけです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です