🎉 std::function がヒープメモリを確保する条件とは?— コピーキャプチャされた変数の型がカギ
📌 この記事は Zenn に投稿した内容のアーカイブです。 はじめに C++ の std::function は「小さいオブジェクトならヒープ確保しない(Small Object Optimization, SOO)」という知識は一般的です。しかし、以下のようなコードでは意外な挙動が観察されます: struct A { int value; A(int v) : value(v) {} A(const A &other) : value(other.value) {} }; struct B { int value; B(int v) : value(v) {} }; A a{0}; B b{0}; std::function<void()> funcA = [a] {}; // ヒープ確保あり std::function<void()> funcB = [b] {}; // ヒープ確保なし このように、コピーコンストラクタの有無だけ で挙動が変わるのはなぜでしょうか? std::function がローカル格納を行う条件(GCC/libstdc++ 編) libstdc++ の実装(GCC 標準ライブラリ)では、以下の条件を満たすとオブジェクトはヒープではなくローカルに保存されます: static const bool __stored_locally = (__is_location_invariant<_Functor>::value && sizeof(_Functor) <= _M_max_size && __alignof__(_Functor) <= _M_max_align && (_M_max_align % __alignof__(_Functor) == 0)); この中で特に重要なのが: ...