<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Std on Wuyukwi's Notebook</title><link>https://wuyukwi.duckdns.org/tags/std/</link><description>Recent content in Std on Wuyukwi's Notebook</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Thu, 05 Jun 2025 13:03:20 +0900</lastBuildDate><atom:link href="https://wuyukwi.duckdns.org/tags/std/index.xml" rel="self" type="application/rss+xml"/><item><title>🎉 std::function がヒープメモリを確保する条件とは？— コピーキャプチャされた変数の型がカギ</title><link>https://wuyukwi.duckdns.org/posts/zenn-fdcfc181acf35d/</link><pubDate>Thu, 05 Jun 2025 13:03:20 +0900</pubDate><guid>https://wuyukwi.duckdns.org/posts/zenn-fdcfc181acf35d/</guid><description>&lt;blockquote&gt;
&lt;p&gt;📌 &lt;em&gt;この記事は &lt;a href="https://zenn.dev/wuyukwi/articles/fdcfc181acf35d"&gt;Zenn&lt;/a&gt; に投稿した内容のアーカイブです。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;C++ の &lt;code&gt;std::function&lt;/code&gt; は「小さいオブジェクトならヒープ確保しない（Small Object Optimization, SOO）」という知識は一般的です。しかし、以下のようなコードでは意外な挙動が観察されます：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;struct A {
int value;
A(int v) : value(v) {}
A(const A &amp;amp;other) : value(other.value) {}
};
struct B {
int value;
B(int v) : value(v) {}
};
A a{0};
B b{0};
std::function&amp;lt;void()&amp;gt; funcA = [a] {}; // ヒープ確保あり
std::function&amp;lt;void()&amp;gt; funcB = [b] {}; // ヒープ確保なし
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このように、&lt;strong&gt;コピーコンストラクタの有無だけ&lt;/strong&gt; で挙動が変わるのはなぜでしょうか？&lt;/p&gt;
&lt;h2 id="stdfunction-がローカル格納を行う条件gcclibstdc-編"&gt;&lt;code&gt;std::function&lt;/code&gt; がローカル格納を行う条件（GCC/libstdc++ 編）&lt;/h2&gt;
&lt;p&gt;libstdc++ の実装（GCC 標準ライブラリ）では、以下の条件を満たすとオブジェクトはヒープではなくローカルに保存されます：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static const bool __stored_locally =
(__is_location_invariant&amp;lt;_Functor&amp;gt;::value &amp;amp;&amp;amp;
sizeof(_Functor) &amp;lt;= _M_max_size &amp;amp;&amp;amp;
__alignof__(_Functor) &amp;lt;= _M_max_align &amp;amp;&amp;amp;
(_M_max_align % __alignof__(_Functor) == 0));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;この中で特に重要なのが：&lt;/p&gt;</description></item></channel></rss>