<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">