gpt4 book ai didi

c++ - vector 的地址代表什么?

转载 作者:行者123 更新时间:2023-12-01 03:05:04 26 4
gpt4 key购买 nike

如果我从一个函数返回一个 vector ,它被分配到的对象将具有与函数中声明的对象相同的地址(不将其作为引用返回)。例如:

vector<int> f() {
vector<int> foo(5);
cout << &foo << endl;

return foo;
}

int main() {

vector<int> bar = f();
cout << &bar << endl; // == &foo

return 0;
}

然后我假设这是因为复制构造函数和 & 运算符可能以某种方式重载,以便它打印从 foo 复制到 bar 的 vector 类的特定成员的地址。
但是,如果我更改场景并将 f() 移动到类中,则行为将如我最初预期的那样:&foo != &bar:
class A {
vector<int> foo;
public:
vector<int> f() {
foo.push_back(10);
cout << &foo << endl;

return foo;
}
};

int main() {
A a;
vector<int> bar = a.f();
cout << &bar << endl; // != &foo

return 0;
}

你能解释一下会发生什么吗?

最佳答案

What does the address of a vector represent?



计算机内存可以是一个字节数组。内存地址是该图形数组的索引。这对所有对象都是一样的,包括 vector 。

If I return a vector from a function, the object to which it is assigned will have the same address (without returning it as a reference) as the one declared in the function.



标准不保证这一点。但确实有可能。只要使用命名返回值优化来消除返回值的复制/移动,就会发生这种情况。

Then I assumed that this is happening because of the ... & operator may be overloaded in a way such that ...



vector 的 addressof 运算符未重载。

Can you explain what happens?



您返回成员的拷贝而不是本地自动变量。在这种情况下不能使用 NRVO。

不考虑子对象,在任何给定时间不能有多个对象重叠相同的内存。如果两个对象同时存在,那么它们每个都必须有一个不同的地址。另一方面,一旦一个对象的内存被释放,它就可以被另一个对象重用。

在第一个例子中,局部变量的生命周期结束,所以它的内存与从返回值初始化的变量的内存重叠是没有问题的。

在第二个例子中,生命周期 a因此它的成员也与 bar 的生命周期重叠,因此它们不能在内存中重叠。

关于c++ - vector 的地址代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58672220/

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