【发布时间】:2013-07-11 09:18:19
【问题描述】:
下面的代码有问题吗?
#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 表达式 (5.3.4) 调用的分配函数 (3.7.4.1) 分配 size 字节的存储空间,适当对齐以表示该大小的任何对象。
我想如果我从堆中分配,对齐问题就会消失。
【问题讨论】:
-
在多线程环境下效果不佳
-
@bobah 没有什么是互斥锁无法修复的。
-
std::function有什么问题? -
一旦您按如下所述修复对齐方式,此特定代码就可以工作。但是,如果你的 lambda 捕获了任何需要析构函数的东西,你就不会调用它,所以你会得到泄漏。
-
@user1095108 你不需要
std::function。只需存储一个静态的functor_type而不是放置新的。