使用新的auto关键字降低了我的代码执行时间。我将问题缩小到以下简单的代码片段:#include#include#include#include#includeusingnamespacestd;voidfunc1(map>>&m){vector>&v=m[1];}voidfunc2(map>>&m){autov=m[1];}voidmain(){map>>m;m[1].push_back(deque(1000,1));clock_tbegin=clock();for(inti=0;i我在i7/Win7机器(Release模式;VS2010)上得到的输出是:100000xfunc1:0
有什么区别:autox=vector();和vectorx;这两个声明是等价的,还是在运行时复杂度上有一些不同? 最佳答案 自C++17以来,它们具有相同的效果。两者都构造了一个名为x的对象。类型为std::vector,由std::vector的默认构造函数初始化.正好第一个是copyinitialization,x从value-initialized复制初始化暂时的。从C++17这种copyelision得到保证,因此x由std::vector的默认构造函数初始化直接地。在C++17之前,复制省略是一种优化:evenwhenit
这个问题在这里已经有了答案:WhatisasmartpointerandwhenshouldIuseone?(14个回答)WhichkindofpointerdoIusewhen?(4个回答)关闭9年前。std::unique_ptr的推荐用途是什么?我发现:Aboutunique_ptrperformances我已经知道了:std::unique_ptr是在C++11中开发的,作为std::auto_ptr的替代品std::unique_ptr没有引用计数并且“拥有”它指向的对象没有std::unique_ptr的复制/分配当我需要一个唯一指针时,std::unique_ptr是转到
在下面的代码中,while(!Ref.expired());被愉快地优化为无限循环。如果代码行改为while(!Ref.lock());。一切都按预期工作。所以真的有两个问题:1)当std::weak_ptr::expired()访问内存隔离计数器时,编译器如何优化过期?2)Ref.lock()真的安全吗,或者这也可以优化掉?下面的示例代码。#include#include#include#includeclassA{public:A(){m_SomePtr=std::make_shared(false);}virtual~A(){std::weak_ptrRef=m_SomePtr;
这个问题在这里已经有了答案:Whydostd::shared_ptrwork(6个回答)关闭3年前。我写了下面的代码来看看shared_ptr当它是对shared_ptr的最后一次引用时会运行并且本身就被摧毁了。#include#include#includeusingnamespacestd;structThing{~Thing(){coutvoidPtr;{shared_ptrthingPtr=make_shared();voidPtr=thingPtr;}cout哪些输出:thingPtrisdeadDestroyedvoidPtrisdead它的行为方式我喜欢,但这完全出乎意料
Arecentquestion(尤其是我的回答)让我想知道:在C++11(和更新的标准)中,析构函数总是隐式的noexcept,除非另有说明(即noexcept(false))。在这种情况下,这些析构函数可以合法地抛出异常。(请注意,这仍然是一种你应该真正知道自己在做什么——那种情况!)然而,所有的重载std::unique_ptr::reset()被声明为始终为noexcept(见cppreference),即使析构函数ifT不是,如果析构函数在reset()期间抛出异常,将导致程序终止.类似情况适用于std::shared_ptr::reset().为什么是reset()总是noe
我见过使用vector的代码,vectors;s.push_back(11);s.push_back(22);s.push_back(33);s.push_back(55);for(vector::iteratorit=s.begin();it!=s.end();it++){cout同理for(autoit=s.begin();it!=s.end();it++){cout在这种情况下使用auto关键字有多安全?如果vector的类型是float呢?字符串? 最佳答案 这是附加信息,不是答案。在C++11中你可以这样写:for(aut
在C++标准草案(N3485)中,它声明如下:20.7.1.2.4unique_ptr观察者[unique.ptr.single.observers]typenameadd_lvalue_reference::typeoperator*()const;1Requires:get()!=nullptr.2Returns:*get().pointeroperator->()constnoexcept;3Requires:get()!=nullptr.4Returns:get().5Note:usetypicallyrequiresthatTbeacompletetype.你可以看到oper
我正试图围绕C++11的新习语展开思考。似乎至少使用shared_ptr与使用newT()之间存在实质性区别和make_shared().但是如何重置共享指针以指向某事物的新实例。以前,我通常会使用reset(newT())成员。但是,这不会遇到与一开始不使用make_shared()相同的问题吗?(即它不允许make_shared分配对象,因此它被迫将引用计数放在单独的分配中,而不是与T本身在同一分配中?)继续使用会不会更好:mysharedptr=make_shared(args...);或者有没有更好的方法?并且不应该像make_shared那样重置提供参数的可变参数转发,以便可
今天我找到了这段代码#includeautoterminal=[](autoterm){return[=](autofunc){returnterminal(func(term));};};令人惊讶的是,GCCacceptsit.Clang拒绝它,因为它在自己的初始化程序中使用terminal并声明为auto。我期待clang给出的错误,但它实际上是不正确的吗?还是必须接受代码? 最佳答案 我认为这符合§7.1.6.4[dcl.spec.auto]/p11:Ifthetypeofanentitywithanundeducedplac