Issue |
133901
|
Summary |
[libc++] Excessive memory consumption by std::function at compile time (vs libstdc++)
|
Labels |
|
Assignees |
|
Reporter |
o-sdn-o
|
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
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs