<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/133901>133901</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [libc++] Excessive memory consumption by std::function at compile time (vs libstdc++)
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          o-sdn-o
      </td>
    </tr>
</table>

<pre>
    Assigning any new callable to std::function consumes excessive (vs libstdc++) memory at compile time. This makes it impossible to compile std::function-heavy projects on 32-bit platforms.

Repro:
- Build test.cpp against libc++:
 ```sh
  clang++ test.cpp
  ```
- `test.cpp`:
  ```c++
  #include <functional>

  //#define JOIN(a, b) _JOIN(a, b)
  //#define NEWVAR JOIN( qqq, __COUNTER__  )
  //#define _JOIN(a, b) a ## b
  //static void f(int){}
  //template<int> struct s{ void operator()(){}; };
  int main(int, char**)
  {
      //ok
      //auto q = std::function<void()>{};
      //#define a q = f;
      
      //ok
 //#define a auto NEWVAR = []{ };
      
      //ok
      //auto q = std::function<void()>{};
      //auto v = []{};
      //#define a std::function<void()>{ v };
      
      //ok
      //#define a std::function<void()>{ std::function<void()>{} };
      
      //ok
 //#define a auto NEWVAR = s<__COUNTER__>{};
      
      //ok
 //#define a auto NEWVAR = std::hash<s<__COUNTER__>>{};
      
      //ok
 //#define a std::allocator<s<__COUNTER__>> NEWVAR;
      
      //not ok. excessive memory consumption
      //#define a std::function<void()>{ []{} };
      
      //not ok. excessive memory consumption
      //auto q = std::function<void()>{};
      //#define a q = []{};
      
      //not ok. excessive memory consumption
      //auto q = std::function<void()>{};
 //#define a q = s<__COUNTER__>{};
      
      #define a std::function<void()>{ []{} };
      a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a
      a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a
 a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a
      // Eats ~2.5GB of RAM with libc++ (part of LLVM project)
 // Eats ~200MB of RAM with libstdc++ (part of gcc project)
      a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a
      a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a
      a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a
      // Eats ~5.0GB of RAM with libc++ (part of LLVM project)
      // Eats ~300MB of RAM with libstdc++ (part of gcc project)
  }
  ```

It's like some sort of template instantiation avalanche inside std::function.

Tested on `FreeBSD 14.2-RELEASE-p1`.  
x-link: https://github.com/directvt/vtm/issues/719#issuecomment-2764746551
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWF9v4jgQ_zTmZUTk2ITAAw-B0tOe2q7U7e09Vo5jiK-OncYOu325z35yEigF-v92V9rCWInizPzmNx47xsOslUstxARFUxSd9FjtclNNTN9mum96qcnuJkmjI_USmL4DLb4BZ0qxVAlwBqzLEE0QTRa15k4aDdxoWxfCgvjOhbVyJQCR0cqCkql1GUdk2rQxFKIw1R0wB9wUpfSAshABXOXSQsFuhAXpQBalsVZ2_taae377uWCrOygr84_gzoLRQEk_lQ5KxdzCVIUNEE4QTi5FWRlvjJM-TGupMnDCuoCXJbAlk9o6z3VNtFEENMRts7l_BK6YXrYaG-vmxUaxgUdDvHk7xB3Wvc7aR9NJqNRc1ZkARGfrsJhCdN7y9iqnTaOZWEgt4M_Pny4QGTFEZpD6Eb3e7TlodjH_-2tyubaG29tbr359Pfv818XV_PL62pscNt1zAMwTR4RCumVgHXOSw8rIDBaIjKR2HjGeovhkS82JwidHIDrzGnQO1lU1d2BRPG2tTSkq5kyFyMgjtNcWh06hvTWIUjsomNRrbzPgOasQSZrWRRO3uv7XMjA3Ox2sdgZuAdGT_SmG6Mxz6kjQ-YbHDsb9cLEOavFA6RCFfcuGSZcqj9EuUT8wu05_QkgNxuohj2djf4k3D_q6cF7t4YVBv4jH82myiM62ltLhMX0j9DqQnNkc0dkBV-_wtkFnShnerLlHXHScnvChjQNzE2xtAd23vt0cyiYL70zr9jx8JndvoPNjvgOPrp1fx_cxqq-cx_9j8thRfmc55vljiM_zLydxlB8pO3sQzJmz8C8Joj-mYBZwmZzDN-nyrdOUPwqWrHL-9dnZ1_P1ea37h_4QB-PzPZz7E-Q21JLzHaTjF-b3l2OeP4Yc8_wx5PB2EgX4rdvJPhh9156yqV5t1fgQTj45RGILSt4IsKbwlxZiXd8Cqa1j2knWVEjZiimmed70y-xAMbOrVF4J60QGRnuPp5UQ0y8nEA4C0r-cn82TL_N-GaIhDpqT2Pe-kvoG0QRy50rrAZvIl9LldRpwUyBymslKcLdyiJyunO-Q1tbCInIah2NEaPPITVEI7fokHg7iwTCKwl42odmYjllPTMJ4QCM8joajXj7BlLBRtgjHqRjgOM7GIzaMojhKo0FMuch6ckIwifAAhyEJyWAU4JQxHi7GFGeMpHyBBlgUTKpAqVURmGrZazhMQkrHOOwplgpl1_XpauK1-mm9tGiAlbTO3ts56VRTyd4q3kYnMH_iEA3p3YEK9k5B-pHyda-u1OSJofa8ult_M4_ux7uLbzUh_wUAAP__K32AoA">