草庐IT

weak_ptr_cast

全部标签

c++ - 通过 shared_ptr 访问是否比原始指针更污染缓存行?

我知道一个好的编译器可以执行优化以便访问,比如int*通过std::shared_ptr使用与原始int*相同的程序集完成使用了指针。我的问题是:包含优化智能指针的缓存行是否会被智能指针的其他数据成员污染,比如引用计数器?因此,虽然生成的程序集与真实指针相同,但缓存性能可能会更差,因为没有那么多缓存行得到有效使用?编辑:如果我们遍历类似std::vector>的结构,这种性能影响可能会更加明显并使用整数。 最佳答案 有几件事需要考虑,但总而言之可以说:这并不重要。首先,根本不能保证(或者更确切地说,没有要求)有一个引用计数器。仅要求

c++ - 使用 std::shared_ptr 和 std::thread 的编译器错误

我正在尝试使用shared_ptr启动线程从类Test,我得到这个错误:/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/include/g++-v4/functional:559:2:note:noknownconversionforargument1from'std::shared_ptr'to'std::shared_ptr&'示例代码:std::shared_ptrtest=std::make_shared();std::threadth(&Test::run,test);//CompilererrorTest*test2=newTest;std::

c++ - 使用 brace-init 初始化对 std::shared_ptr 的引用

这个问题在这里已经有了答案:Whycan'tIinitializeareferenceinaninitializerlistwithuniforminitialization?(3个答案)关闭8年前。我最近在编写代码,无意中发现了GCC和Clang中的一些不寻常之处。使用brace-init会在gcc中触发编译错误,而直接初始化如&b=a会起作用。下面的代码是我遇到的这种行为的一个非常简单的例子,我想知道为什么GCC不编译代码,因为没有一个shared_ptr采用initializer_list而a是一个左值#include#includeintmain(){std::shared_p

c++ - 延迟构造的 shared_ptr

编辑:完全重新编辑,因为原作变得一团糟:)到目前为止,感谢大家的投入;我希望我把它写进了下面的文字中。题我正在寻找一个懒惰创建的可共享指针。我有一个假设的大类东西。东西很大,因此制作成本很高,但是虽然它们在代码中无处不在(共享、自由传递、修改、存储以备后用等),但它们往往最终没有真正使用,因此延迟了它们的实际使用在实际访问它们之前创建是可取的。因此,事物需要懒惰地创建,并且需要可共享。让我们称之为封装指针包装器SharedThing。classSharedThing{...Thing*m_pThing;Thing*operator->(){//ensurem_pThingiscreat

c++ - 为什么 std::shared_ptr<T[]> 没有专门化?

我想知道为什么std::unique_ptr直接支持动态数组但不是std::shared_ptr:unique_ptrptr1(newint[n]);///OK!shared_ptrptr2(newint[n]);///Incorrect:willnotcalldelete[]更新:我发现第二行可以重写为:shared_ptrptr2(newint[n],default_delete());现在我想知道在幕后发生了什么使得std::shared_ptr使用第二种方法,而不是类似于std::unique_ptr的方式? 最佳答案 对于

c++ - 为什么我在这个简单的代码中得到 "ld: warning: direct access in _main to global weak symbol"?

这个问题在这里已经有了答案:xcodewithboost:linker(Id)Warningaboutvisibilitysettings(6个答案)关闭5年前。在我的Clang编译器中这是非常奇怪的行为。我使用Xcode(OSX),所有都是最新的。为什么我会在那个简单的代码中收到此警告?如果我删除这两行,警告就会隐藏。ld:warning:directaccessin_maintoglobalweaksymbolstd::__1::char_traits::eq(char,char)meanstheweaksymbolcannotbeoverriddenatruntime.Thisw

c++ - 如何检查 duration_cast 是否溢出

我需要将一种std::chrono::duration转换为另一种,但我需要知道何时无法进行这种转换,因为该值无法表示。我没有在标准库中找到任何工具来检查这个。cppreferencepage没有指定如果值超出范围会发生什么,只是从float到整数的转换可能是未定义的行为(在我的例子中,我需要从整数转换为整数)。 最佳答案 没有一刀切的解决方案,但是适合许多用例的解决方案是使用基于double的duration用于范围检查。也许是这样的:#include#include#includetemplateDurationchecked_

c++ - 无法为 unique_ptr 返回类型返回 nullptr

我正在为SDL_Texture*原始指针编写一个包装器,它返回一个unique_ptr。usingTexturePtr=std::unique_ptr;TexturePtrloadTexture(SDL_Renderer*renderer,conststd::string&path){ImagePtrsurface=loadImage(path);if(surface){returnTexturePtr(SDL_CreateTextureFromSurface(renderer,surface.get()),SDL_DestroyTexture);}returnnullptr;}但它给

c++ - 如何防止为 unique_ptr 删除 px.get()

在boost.org网站上,我看到了一个阻止deletepx.get()forashared_ptr(http://www.boost.org/doc/libs/1_51_0/libs/smart_ptr/sp_techniques.html#preventing_delete)的示例。这是一项很好的技术,我想在C++11中使用std::unique_ptr来应用它,经过一段时间的工具化后,我无法完全理解他们的示例如何使用std::unique_ptr。是否可以防止在std::unique_ptr上调用deletepx.get()?这是来自boost.org网站的代码,展示了如何防止调

c++ - shared_ptr 的 dtor 是否需要使用 "deleter"?

It'swidelyknown您可以使用shared_ptr来存储指向不完整类型的指针,只要在构造shared_ptr期间可以删除该指针(具有明确定义的行为).例如,PIMPL技术:structinterface{interface();//out-of-linedefinitionrequired~interface()=default;//publicinlinemember,evenifimplicitlydefinedvoidfoo();private:structimpl;//incompletetypestd::shared_ptrpimpl;//pointertoinco