下面的代码有问题吗?
#include <iostream>
#include <type_traits>
template <typename T>
void assign_lambda(T&& f)
{
typedef typename std::remove_reference<T>::type functor_type;
typedef typename std::aligned_storage<sizeof(functor_type),
std::alignment_of<functor_type>::value>::type buffer_type;
static char store[sizeof(buffer_type)];
auto const p(new (store) functor_type(std::forward<T>(f)));
(*p)();
}
int main()
{
for (int i(0); i != 5; ++i)
{
assign_lambda([i](){ std::cout << i << std::endl; });
}
return 0;
}
我担心这可能是不标准的和/或危险的。
编辑:为什么初始化成char
你问的数组?sizeof(buffer_type)
如果该块应该足够大,则可以从堆中分配一块大小并重复使用以进行重复分配(即避免重复的内存分配)。
void*operator new(std::size_t size);
效果:new-expression (5.3.4) 调用的分配函数 (3.7.4.1) 分配 size 字节的存储,适当对齐以表示该大小的任何对象。
我想如果我从堆中分配,对齐问题就会消失。