草庐IT

compare_exchange_weak

全部标签

c++ - weak_ptr 的性能损失是多少?

我目前正在为游戏设计一个对象结构,在我的例子中,最自然的组织变成了一棵树。作为智能指针的忠实粉丝,我只使用shared_ptr的。然而,在这种情况下,树中的子节点需要访问它的父节点(例如——map上的生物需要能够访问map数据——因此他们的父节点的数据。拥有的方向当然是map拥有它的存在,因此持有指向它们的共享指针。然而,为了从一个存在中访问map数据,我们需要一个指向父级的指针——智能指针的方式是使用一个引用,即weak_ptr。但是,我曾经读到锁定weak_ptr是一项昂贵的操作——也许这不再是真的了——但考虑到weak_ptr会经常被锁定,我担心这种设计注定性能不佳。因此问题:锁

c++ - weak_ptr 的性能损失是多少?

我目前正在为游戏设计一个对象结构,在我的例子中,最自然的组织变成了一棵树。作为智能指针的忠实粉丝,我只使用shared_ptr的。然而,在这种情况下,树中的子节点需要访问它的父节点(例如——map上的生物需要能够访问map数据——因此他们的父节点的数据。拥有的方向当然是map拥有它的存在,因此持有指向它们的共享指针。然而,为了从一个存在中访问map数据,我们需要一个指向父级的指针——智能指针的方式是使用一个引用,即weak_ptr。但是,我曾经读到锁定weak_ptr是一项昂贵的操作——也许这不再是真的了——但考虑到weak_ptr会经常被锁定,我担心这种设计注定性能不佳。因此问题:锁

c++ - 等式比较 std::weak_ptr

我想比较两个std::weak_ptr或一个std::weak_ptr和一个std::shared_ptr是否相等。我想知道的是每个weak_ptr/shared_ptr指向的对象是否相同。不仅如果地址不匹配,而且如果底层对象被删除然后偶然用相同的地址重建,则比较应该会产生负面结果。所以基本上,即使分配器保留相同的地址,我也希望这个断言成立:autos1=std::make_shared(43);std::weak_ptrw1(s1);s1.reset();autos2=std::make_shared(41);std::weak_ptrw2(s2);assert(!equals(w1

c++ - 等式比较 std::weak_ptr

我想比较两个std::weak_ptr或一个std::weak_ptr和一个std::shared_ptr是否相等。我想知道的是每个weak_ptr/shared_ptr指向的对象是否相同。不仅如果地址不匹配,而且如果底层对象被删除然后偶然用相同的地址重建,则比较应该会产生负面结果。所以基本上,即使分配器保留相同的地址,我也希望这个断言成立:autos1=std::make_shared(43);std::weak_ptrw1(s1);s1.reset();autos2=std::make_shared(41);std::weak_ptrw2(s2);assert(!equals(w1

使用 header `<atomic>` 实现自旋锁的 C++11

我实现了SpinLock类,如下structNode{intnumber;std::atomic_boollatch;voidadd(){lock();number++;unlock();}voidlock(){boolunlatched=false;while(!latch.compare_exchange_weak(unlatched,true,std::memory_order_acquire));}voidunlock(){latch.store(false,std::memory_order_release);}};我实现了上面的类并创建了两个线程,每个线程调用同一Node类

使用 header `<atomic>` 实现自旋锁的 C++11

我实现了SpinLock类,如下structNode{intnumber;std::atomic_boollatch;voidadd(){lock();number++;unlock();}voidlock(){boolunlatched=false;while(!latch.compare_exchange_weak(unlatched,true,std::memory_order_acquire));}voidunlock(){latch.store(false,std::memory_order_release);}};我实现了上面的类并创建了两个线程,每个线程调用同一Node类

c++ - shared_ptr 和 weak_ptr 失败的小例子

我在使用shared_ptr时遇到问题和weak_ptr连同enable_shared_from_this.当我用谷歌搜索我所看到的症状时,每个人都建议“当没有shared_from_this()实例拥有你的对象时,你不能使用shared_ptr。但这不是我的情况。考虑这段代码:#include#includeclassMyClass:std::enable_shared_from_this{public:voidthis_fails(){//Doesn'tevenassert(),becauseitthrowsbad_weak_ptrassert(shared_from_this()

c++ - shared_ptr 和 weak_ptr 失败的小例子

我在使用shared_ptr时遇到问题和weak_ptr连同enable_shared_from_this.当我用谷歌搜索我所看到的症状时,每个人都建议“当没有shared_from_this()实例拥有你的对象时,你不能使用shared_ptr。但这不是我的情况。考虑这段代码:#include#includeclassMyClass:std::enable_shared_from_this{public:voidthis_fails(){//Doesn'tevenassert(),becauseitthrowsbad_weak_ptrassert(shared_from_this()

c++ - 在std::exchange中,为什么第二个模板参数默认了?

C++14标准为std::exchange指定以下声明:templateTstd::exchange(T&obj,U&&new_value);我想知道为什么U默认为T,因为U可以通过new_value找到。在什么情况下,这会导致不同的结果:templateTstd::exchange(T&obj,U&&new_value); 最佳答案 std::exchange建议于N3511没有默认模板参数,后来N3608使用默认模板参数。请注意,在N3608中提供了以下推理:Givingthesecondtemplateargumentadef

c++ - 在std::exchange中,为什么第二个模板参数默认了?

C++14标准为std::exchange指定以下声明:templateTstd::exchange(T&obj,U&&new_value);我想知道为什么U默认为T,因为U可以通过new_value找到。在什么情况下,这会导致不同的结果:templateTstd::exchange(T&obj,U&&new_value); 最佳答案 std::exchange建议于N3511没有默认模板参数,后来N3608使用默认模板参数。请注意,在N3608中提供了以下推理:Givingthesecondtemplateargumentadef