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