c++ 我可以在我自己的内存中放置一个std::函数来捕获lambda吗?

aiazj4mn  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(104)

我有一个lambda,我把它存储到一个std::function中,在一个单独的线程中调用,看起来像这样:

void * specialMalloc(size_t size);  // provides annointed memory; beloved by all

int n;
std::function f = [=]()mutable -> void {
    printf("%i", n); 
};

有没有可能创建一个std::function f,它接受这个lambda,它是int n,并要求specialMalloc()仔细准备内存来放置它?特别是在C++17中,我读到定制分配器已经被弃用了?

yrdbyhpb

yrdbyhpb1#

在当前的C++中,没有办法自定义传递分配器。std::function将使用全局operator new。它甚至不会使用类的操作符new,而是调用全局操作符。
然而std::function通常使用小对象优化。至少你期望它为指针大小的函子服务。真实的实现有2-3个指针的小对象优化缓冲区,MSVC有更多。使用小对象优化,std::function根本不使用间接内存。
您的函数的大小为int,这很可能适合小对象优化。您的函数在放入std::function时不会导致任何分配函数被调用。
对于较大的函子,您可以使其数据间接,并自行分配,这样它们将利用小对象优化,从而不会使用全局运算符new
对于小对象优化,还有其他一些标准需要考虑,特别是noexcept复制构造函数,并且不要过度对齐。
不幸的是,没有标准的方法在编译时查询小对象优化是否适用,标准也不要求这样做(尽管推荐用于某些类型的函子)

jfgube3f

jfgube3f2#

我觉得这不是个好办法。
好吧,std::function有一个构造函数,它接受一个自定义分配器,但是这个功能是removed in C++17

相关问题