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

Reply via email to