草庐IT

together_unique

全部标签

c++ - 两个 unique_ptr<T> 的无锁交换

交换两个unique_ptr不能保证是线程安全的。std::unique_ptra,b;std::swap(a,b);//notthreadsafe由于我需要原子指针交换,并且我喜欢unique_ptr的所有权处理,有没有一种简单的方法可以将它们结合起来?编辑:如果这是不可能的,我愿意接受替代方案。我至少想做这样的事情:threadshared_unique_ptrglobal;voidf(){threadlocal_unique_ptrlocal(newT(...));local.swap_content(global);//atomicallyforglobal}在C++11中这样

c++ - 两个 unique_ptr<T> 的无锁交换

交换两个unique_ptr不能保证是线程安全的。std::unique_ptra,b;std::swap(a,b);//notthreadsafe由于我需要原子指针交换,并且我喜欢unique_ptr的所有权处理,有没有一种简单的方法可以将它们结合起来?编辑:如果这是不可能的,我愿意接受替代方案。我至少想做这样的事情:threadshared_unique_ptrglobal;voidf(){threadlocal_unique_ptrlocal(newT(...));local.swap_content(global);//atomicallyforglobal}在C++11中这样

C++ std::unique_ptr:为什么 lambda 没有任何尺寸费用?

我正在阅读“有效的现代C++”。在std::unique_ptr相关的条目中声明如果自定义删除器是无状态对象,则不会产生大小费用,但如果它是函数指针或std::function尺寸费用发生。你能解释一下为什么吗?假设我们有以下代码:autodeleter_=[](int*p){doSth(p);deletep;};std::unique_ptrup(newint,deleter_);据我了解,unique_ptr应该有一个decltype(deleter_)类型的对象,并将deleter_分配给该内部对象。但显然这不是正在发生的事情。你能用尽可能小的代码示例解释这背后的机制吗?

C++ std::unique_ptr:为什么 lambda 没有任何尺寸费用?

我正在阅读“有效的现代C++”。在std::unique_ptr相关的条目中声明如果自定义删除器是无状态对象,则不会产生大小费用,但如果它是函数指针或std::function尺寸费用发生。你能解释一下为什么吗?假设我们有以下代码:autodeleter_=[](int*p){doSth(p);deletep;};std::unique_ptrup(newint,deleter_);据我了解,unique_ptr应该有一个decltype(deleter_)类型的对象,并将deleter_分配给该内部对象。但显然这不是正在发生的事情。你能用尽可能小的代码示例解释这背后的机制吗?

c++ - 对 unique_ptrs 集的原始指针查找

我经常发现自己想写这样的代码:classMyClass{public:voidaddObject(std::unique_ptr&&newObject);voidremoveObject(constObject*target);private:std::set>objects;};然而,std::set接口(interface)的大部分内容对于std::unique_ptrs来说是无用的,因为查找函数需要std::unique_ptr参数(我显然没有,因为它们归集合本身所有).我可以想到两个主要的解决方案。创建一个临时的unique_ptr用于查找。例如,上面的removeObject

c++ - 对 unique_ptrs 集的原始指针查找

我经常发现自己想写这样的代码:classMyClass{public:voidaddObject(std::unique_ptr&&newObject);voidremoveObject(constObject*target);private:std::set>objects;};然而,std::set接口(interface)的大部分内容对于std::unique_ptrs来说是无用的,因为查找函数需要std::unique_ptr参数(我显然没有,因为它们归集合本身所有).我可以想到两个主要的解决方案。创建一个临时的unique_ptr用于查找。例如,上面的removeObject

c++ - 为什么 unique_ptr 实例化编译为比原始指针更大的二进制文件?

我一直认为std::unique_ptr与使用原始指针相比没有开销。但是,编译如下代码#includevoidraw_pointer(){int*p=newint[100];delete[]p;}voidsmart_pointer(){autop=std::make_unique(100);}使用g++-std=c++14-O3生成以下程序集:raw_pointer():subrsp,8movedi,400calloperatornew[](unsignedlong)addrsp,8movrdi,raxjmpoperatordelete[](void*)smart_pointer():

c++ - 为什么 unique_ptr 实例化编译为比原始指针更大的二进制文件?

我一直认为std::unique_ptr与使用原始指针相比没有开销。但是,编译如下代码#includevoidraw_pointer(){int*p=newint[100];delete[]p;}voidsmart_pointer(){autop=std::make_unique(100);}使用g++-std=c++14-O3生成以下程序集:raw_pointer():subrsp,8movedi,400calloperatornew[](unsignedlong)addrsp,8movrdi,raxjmpoperatordelete[](void*)smart_pointer():

c++ - 那么在 STL 集合中可以安全地使用 unique_ptr 吗?

我对unique_ptr和右值移动哲学感到困惑。假设我们有两个集合:std::vector>autoCollection;std::vector>uniqueCollection;现在我预计以下操作会失败,因为不知道算法在内部做什么,并且可能会制作内部数据透视拷贝等,从而剥夺auto_ptr的所有权:std::sort(autoCollection.begin(),autoCollection.end());我明白了。并且编译器正确地不允许这种情况发生。然后我这样做:std::sort(uniqueCollection.begin(),uniqueCollection.end());然

c++ - 那么在 STL 集合中可以安全地使用 unique_ptr 吗?

我对unique_ptr和右值移动哲学感到困惑。假设我们有两个集合:std::vector>autoCollection;std::vector>uniqueCollection;现在我预计以下操作会失败,因为不知道算法在内部做什么,并且可能会制作内部数据透视拷贝等,从而剥夺auto_ptr的所有权:std::sort(autoCollection.begin(),autoCollection.end());我明白了。并且编译器正确地不允许这种情况发生。然后我这样做:std::sort(uniqueCollection.begin(),uniqueCollection.end());然