当前的C++ 11标准不支持在lambda表达式中移动捕获变量
unique_ptr<int[]> msg(new int[1000000]);
async_op([&&msg] { // compile error : move capture is not supported
/* do something */
});
Run Code Online (Sandbox Code Playgroud)
由于消息传递和唯一所有权在某些异步系统设计中具有一定的关键作用,我认为移动语义应该被视为一级语言语义.但是lambda不支持移动捕获.
当然,我知道,有一些解决方法使用移动捕获代理-但我不知道的原因,这个功能不被包括在C++ 11标准,尽管它的重要性决定的.
struct test_struct
{
test_struct() {}
~test_struct() {}
};
#include <vector>
#include <memory>
#include <cstdio>
int main()
{
printf("ctor begin\n");
{
std::vector<std::unique_ptr<test_struct>> test_vec;
const int count = 100000;
for (auto i = 0; i < count; i++) {
test_vec.emplace_back(new test_struct);
}
printf("dtor begin\n");
}
printf("dtor end\n");
}
Run Code Online (Sandbox Code Playgroud)
我正在使用VS2010,并发现了一些荒谬的性能问题.上面的代码在调试和发布版本(ctrl + f5)中运行良好,但是当附加调试器时(f5),dtor对unique_ptr类的调用是无法忍受的.结果机器代码是相当优化的,所以我不期望它是编译器问题而不是调试器,但我不知道如何处理它.我的问题是
目前我想在多线程环境中创建包装器访问器类.这个类的目的很简单 - 抓住它的结构锁定并释放它的破坏锁定.除此之外,它与普通指针相同.此外,我想防止在堆区域上创建它以确保最终释放锁.
逆是相当容易的(私有构造函数与工厂方法),但我不知道只有堆栈的变量是可能的.反正呢?
当源整数的大小是任意的时,是否有任何有效的数字系统之间的转换算法?
例如,假设存在一个整数数组{1,4,8},其为十进制格式的148作为输入.它可能以十六进制格式转换为{9,4},或以八进制转换为{2,2,4},或以二进制格式转换为{1,0,0,1,0,1,0,0},或仅{以1234-ary格式或其他东西.
当实际值可以用机器支持的字大小表示时,这很简单.但是当它达到任意大小时,我找不到比O(n ^ 2)更好的有效方法.
我在C++ 11中使用lambda 创建了一个finally模拟器,如下所示:
#include <cstdio>
template<typename Functor>
struct Finalizer
{
Finalizer(Functor& func) : func_(func) {} // (1)
~Finalizer() { func_(); }
private:
Functor func_; // (2)
};
template<typename functor>
Finalizer<functor> finally(functor& func)
{
return Finalizer<functor>(func); (3)
}
int main()
{
int a = 20;
// print the value of a at the escape of the scope
auto finalizer = finally([&]{ printf("%d\n", a); }); // (4)
}
Run Code Online (Sandbox Code Playgroud)
代码按预期工作,但在Finalizer struct(1)的ctor处有不需要的copy ctor调用(lambda functor ).(值得庆幸的是,RVO可以避免在finally函数(3 - > 4)的return语句中进行复制构造.)
编译器不会消除copy …
#include <memory>
struct a {};
struct b : public a {};
std::shared_ptr<b> get()
{
std::shared_ptr<a> temp(new b);
return std::static_pointer_cast<b>(temp); // atomic ref-count inc/dec
}
Run Code Online (Sandbox Code Playgroud)
据我所知,downcast shared_ptr的唯一方法是static_pointer_cast.但是,它只需要const引用并创建参数的下载副本.如果可能的话,我想避免复制,因为复制构造和shared_ptr的破坏意味着原子递增/递减操作.
有一些移动构造函数采用shared_ptr的其他实例,但它们不支持向下转换.
是否可以避免以符合标准的方式复制?
c++ ×5
c++11 ×3
lambda ×2
debugging ×1
downcast ×1
finally ×1
integer ×1
shared-ptr ×1
stack ×1
unique-ptr ×1
visual-c++ ×1