Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+;中std::unique#ptr使Boost.Pointer容器过时+;11/14?_C++_Boost_C++11_Stl_Smart Pointers - Fatal编程技术网

C++ C+;中std::unique#ptr使Boost.Pointer容器过时+;11/14?

C++ C+;中std::unique#ptr使Boost.Pointer容器过时+;11/14?,c++,boost,c++11,stl,smart-pointers,C++,Boost,C++11,Stl,Smart Pointers,std::unique_ptr是否使Boost.Pointer容器在C++11/14中过时 在C++98/03中,没有移动语义,与原始指针相比,像shared_ptr这样的智能指针具有与引用计数相关的开销(ref计数块和联锁递增/递减)。因此,与std::vector相比,像std::vector这样的东西有开销 但是std::vector是否与std::vector(无参考计数开销)一样高效,并且在异常和自动销毁方面安全(即vector析构函数将自动调用T项的析构函数,其指针存储在vector

std::unique_ptr
是否使Boost.Pointer容器在C++11/14中过时

在C++98/03中,没有移动语义,与原始指针相比,像
shared_ptr
这样的智能指针具有与引用计数相关的开销(ref计数块和联锁递增/递减)。因此,与
std::vector
相比,像
std::vector
这样的东西有开销

但是
std::vector
是否与
std::vector
(无参考计数开销)一样高效,并且在异常和自动销毁方面安全(即
vector
析构函数将自动调用
T
项的析构函数,其指针存储在
vector
中)


如果是这样的话,Boost.Pointer容器在C++11/14代码中是否仍然有一个有效的有用的位置,还是它只是过时了?

它不是obslete;它有一个完全不同的、更多的
直观的界面比
std::vector

更直观,正如James在回答中提到的,Boost.Pointer容器提供了一个比将
独特的\u ptr
粘贴到标准库容器中更直观的界面


除此之外,
boost::ptr_vector
(和朋友们)将指向的类型存储为下面的
void*
,这样就不会为每个
t
都得到一个完整的类模板实例化

structfoo{
INTA;
};
矢量条;
将_向后推(使_唯一(1));

void*
提升也是一种“已知优化”,可以减少
std::vector
的模板实例化,但是当前的libc++和libstdc++都不再使用这种优化。请参见@JonathanWakely。很久以前,但是……您能详细说明一下吗?
struct Foo {
    int a;
};


vector<unique_ptr<Foo>> bar;
bar.push_back(make_unique<Foo>(1));
cout << bar[0]->a << endl; // rvalue, is ok
Foo *foo = bar[1].get(); // try to use a pointer, this interface "bar[1].get()" is awful