gpt4 book ai didi

c++ - 传递的STL容器会生成拷贝吗?

转载 作者:可可西里 更新时间:2023-11-01 15:45:42 25 4
gpt4 key购买 nike

我不记得传递 STL 容器是否会生成容器的拷贝,或者只是另一个别名。如果我有几个容器:

std::unordered_map<int,std::string> _hashStuff;
std::vector<char> _characterStuff;

我想将这些变量传递给一个函数,我可以这样创建函数吗:

void SomeClass::someFunction(std::vector<char> characterStuff);

或者这会复制 unordered_map/vector 吗?我想我可能需要使用 shared_ptr

void SomeClass::someFunction(std::shared_ptr<std::vector<char>> characterStuff);

最佳答案

这取决于。如果你在输入中传递一个 lvalue 给你的函数(实际上,如果你传递的东西有一个名字,地址运算符 & 可以应用到它)那么你的复制构造函数类将被调用。

void foo(vector<char> v)
{
...
}

int bar()
{
vector<char> myChars = { 'a', 'b', 'c' };
foo(myChars); // myChars gets COPIED
}

如果您要传递一个右值(大致来说,就是没有名称并且不能应用地址运算符 & 的东西)并且该类有一个移动构造函数,那么对象将被移动(注意,这与创建“别名”不同,而是将对象的内脏转移到新骨架中,使以前的骨架无用)。

在下面的 foo() 调用中,make_vector() 的结果是一个右值。因此,它返回的对象在 foo() 的输入中被移动(即 vector 的移动构造函数将被调用):

void foo(vector<char> v);
{
...
}

vector<char> make_vector()
{
...
};

int bar()
{
foo(make_vector()); // myChars gets MOVED
}

一些 STL 类有移动构造函数,但没有复制构造函数,因为它们本质上是不可复制的(例如,unique_ptr)。当您将 unique_ptr 传递给函数时,您不会获得它的拷贝。

即使对于那些确实有复制构造函数的类,您仍然可以通过使用 std::move 函数将您的参数从左值更改为右值来强制移动语义,但这同样不会' 创建一个别名,它只是将对象的所有权转移给您正在调用的函数。这意味着除了为原始对象重新分配另一个值或将其销毁之外,您将无法对原始对象执行任何其他操作。

例如:

void foo(vector<char> v)
{
...
}

vector<char> make_vector()
{
...
};

int bar()
{
vector<char> myChars = { 'a', 'b', 'c' };
foo(move(myChars)); // myChars gets MOVED
cout << myChars.size(); // ERROR! object myChars has been moved
myChars = make_vector(); // OK, you can assign another vector to myChars
}

如果您发现左值和右值引用以及移动语义的整个主题晦涩难懂,那是非常容易理解的。我个人认为本教程很有帮助:

http://thbecker.net/articles/rvalue_references/section_01.html

您应该也可以在 http://www.isocpp.org 上找到一些信息或在 YouTube 上(查找 Scott Meyers 举办的研讨会)。

关于c++ - 传递的STL容器会生成拷贝吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14074289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com