vector的地址代表什么?

What does the address of a vector represent?

如果我 return 来自函数的向量,分配给它的对象将具有与函数中声明的相同的地址(没有 return 将其作为引用) .例如:

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 复制的向量 class 的特定成员的地址去酒吧。 但是,如果我改变场景并将 f() 移动到 class 内,行为将如我最初预期的那样:&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?

计算机内存可以被认为是一个字节数组。内存地址是该比喻数组的索引。这对所有对象都是一样的,包括矢量。

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.

标准不保证这一点。但这确实是可能的。只要使用命名 Return 值优化来消除 return 值的 copy/move,就会发生这种情况。

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?

你return一个成员的副本而不是一个本地自动变量。在这种情况下不能使用 NRVO。

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

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

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