草庐IT

make_XYZ

全部标签

c++ - 构造对象时有什么理由不使用 std::make_shared 吗?

我想不出任何情况std::shared_ptrobj(newObject("foo",1));会更喜欢autoobj=std::make_shared("foo",1);后者总是会产生更好的局部性并减少内存碎片。除了与返回原始指针的代码接口(interface)之外,是否有任何情况下您更愿意(或被迫)使用第一种形式? 最佳答案 Thelatteralwaysresultsinbetterlocalityandreducesmemoryfragmentation.不总是。鼓励实现对引用计数的对象和引用计数使用单个分配,但这不是必需这样

c++ - C++ 中的 "As a rule of thumb, make all your methods virtual"- 合理的建议?

我只是偶然看到了标题中的陈述。完整的报价是:Asaruleofthumb,makeallyourmethodsvirtual(includingthedestructor,butnotconstructors)toavoidproblemsassociatedwithomissionofthevirtualkeyword.我在Wrox的书ProfessionalC++中找到了这个。Youcangoogleittocheck.这有什么关系吗?我原以为您只会提供选择的扩展点,而不是默认的可扩展性。例如,a2001articlebyHerbSuttersaysso.从那以后,有什么发生了巨大

c++ - 为什么 boost 没有 make_scoped()?

Boost的make_shared()函数promise在尝试创建shared_ptr时是异常安全的.为什么没有make_scoped()相等的?是否有通用的最佳做法?这是来自boost::scoped_ptrdocumentation的代码示例这对我来说似乎不安全:boost::scoped_ptrx(newShoe);这行代码会依次完成这三件事:为Shoe分配堆内存调用Shoe的构造函数调用boost::scoped_ptr的构造函数如果Shoe的构造函数抛出异常,内存将被泄露。(参见R.MartinhoFernandes的回答)scoped_ptr不会处理释放,因为它还没有被构造

c++ - 如何make_shared派生类?

我想使用make_shared带有派生类的函数,如下所示classBase{public:typedefstd::shared_ptrPtr;};classDerived:publicBase{};Base::PtrmyPtr=std::make_shared(/*Derived()*/);我如何告诉make_shared构建这样一个对象?我想避开经典Base::Ptrptr=Base::Ptr(newDerived());利用make_shared函数中的单个alloc。 最佳答案 std::shared_ptr有一个可以生成sh

c++ - make_unique数组,原始提案与最终提案

StephanTLavavej最初对make_unique的建议是N3588它包括以下功能:make_unique(args...)make_unique_default_init()make_unique(n)make_unique_default_init(n)make_unique_value_init(n,args...)make_unique_auto_size(args...)但是,最后的提案N3656仅包含make_unique(两种形式)。我找不到有关该函数其他形式的任何讨论。我读了theminutesoftheBristolmeeting,但他们甚至都没有引用原始建议

c++ - std::make_shared 与 std::initializer_list

#include#includeclassBase{public:Base(){}};classDerived:publicBase{public:Derived(){}Derived(std::initializer_list>>){}};intmain(intargc,char**argv){autoexample=newDerived({{0,std::make_shared()}});return0;}它正常工作(livepreview),但是当我尝试使用std::make_shared和std::initializer_list作为参数时,我得到了错误:autoexample

c++ - std::weak_ptrs 是否会影响 std::make_shared 分配的内存何时被释放?

如果我调用std::make_shared(而不仅仅是显式分配shared_ptr)那么出于性能原因,我希望引用计数与T的实例一起分配在内存中。一切顺利。但如果我有weak_ptr引用同一个对象的实例,大概他们需要访问该引用计数,以了解该对象是否仍然存在。因此,当T的实例的最后一个shared_ptr被销毁时,对系统的幼稚理解会暗示它无法释放存储T的内存,因为weak_ptrs仍然需要访问该计数。好像有一个separateweakreferencecounter从理论上讲,它可以与T的实例分开保存,以便可以在弱引用仍然存在的情况下销毁T并释放内存。但随后我们又回到了2个单独的分配,从而

c++ - C++1z 中 std::make_pair 和 std::make_tuple 的用处

据我了解,std::make_pair存在的唯一原因和std::make_tuple是您不必自己编写类型,因为它们是自动推导出来的。在C++1z中,我们有templateargumentdeductionforclasstemplates,这让我们可以简单地写std::pairp(1,2.5);//C++1z而不是autop=std::make_pair(1,2.5);//C++11/14std::tuple的情况是类似的。这导致了以下问题:在C++1z中,是否存在使用std::make_pair和std::make_tuple而不是使用的情况std::pair和std::tuple的

c++ - 避免使用 git 和 make 重新编译

我在git中有两个开发分支,我经常需要在两者之间进行切换。然而,真正令人沮丧的是,每次我在git中更改分支时,整个项目都会重新构建,因为某些文件的文件系统时间戳会发生变化。Ofc,makefile被配置为将项目构建到两个不同的构建目录中。有没有办法解决这个问题?编译是一个非常漫长和耗时的过程……编辑:-这是对该问题的更详细的解释...假设我有一个头文件Basic.h,它包含在许多其他文件中。分支1和分支2的Basic.h不同。现在假设我已将分支1编译为build_branch1,将分支2编译为build_branch2。假设我目前已checkout分支2。现在我checkout分支1并

c++ - std::make_shared 是否执行值初始化(GCC 和 clang 不同意)?

我的意思可以用下面的例子来解释:autop=std::make_shared();是int变量默认初始化(因此具有垃圾值)或值初始化(因此具有零值)?我已经在GCC5.2和clang3.6上进行了测试,前者进行值初始化,后者进行默认初始化。我想知道标准对此有何规定?在我看来,现代C++在这种情况下绝对应该执行值初始化。 最佳答案 是的。N379720.8.2.2.6AllocatesmemorysuitableforanobjectoftypeTandconstructsanobjectinthatmemoryviatheplace