我想只允许在我的代码库中使用std :: function(如果它没有做任何分配)。在编译时catch std :: function分配
为此我可以写类似下面的功能,只用它来创建我的功能情况:
template< typename Functor>
std::function<Functor> makeFunction(Functor f)
{
return std::function<Functor>(std::allocator_arg, DummyAllocator(), f);
}
其中DummyAllocator将断言或者如果它都在运行时使用抛出。
理想情况下,虽然我想在编译时分配用例。
即
template< typename Functor>
std::function<Functor> makeFunction(Functor f)
{
static_assert(size needed for function to wrap f < space available in function,
"error - function will need to allocate memory");
return std::function<Functor>(f);
}
是这样的可能吗?
我不认为Small Object Optimization暴露在'std :: function'中,依赖它会导致无法移植的代码。例如。 libC++使用一个大小为3'void *'的缓冲区,这在32位和64位x86系统上是不同的。 libC++使用'sizeof(__ buf_)'来检查是否应该使用SOO,并且我无法找到任何暴露此信息的函数。 – dyp
@dyp那么,代码本身是可移植的。它将在所有平台上编译并产生预期结果。如果这个想法只允许使用不分配std :: function,不管怎样(我可以看到一些合理的场景调用这个),这是明智的做法。在编译时捕获分配是不可能的,因为它们不会在编译时发生。 – SergeyA
@SergeyA如果ctor的剩余代码是constexpr,那么你可以在编译时捕获它们,但这对于SOO是不可能的,因为它必须使用placement-new。我对可移植性的评论更多的是试图解释为什么它没有被暴露。即使'int x = 1 << 17;'也是不可移植的代码,我当然同意OP中的不可移植性是最好的(编译器错误)。 – dyp