gpt4 book ai didi

c++ - vector 元素如何在 vector std::move 之后保留其原始地址?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:28 25 4
gpt4 key购买 nike

正如您在输出中看到的, vector pre 的对象不仅“move ”到 vector post,而且还在内存中保留了它们的原始地址空间.此举背后究竟发生了什么?这种行为是预期的吗?假设我需要一个单独的指向这些对象的指针 vector ,是否可以安全地假设在此 move 之后对象将始终具有其原始地址?

实际上,我有一个包含这样的 vector 和我作为成员提到的指针 vector 的类。我还删除了复制 ctors,并为类定义了 move ctors。

#include <iostream>
#include <vector>

struct B {
int val = 0;
B(int aInt) : val(aInt) { };
};

int main() {

std::vector<B> pre;

pre.push_back(B(1));
pre.push_back(B(2));
std::cout << "pre-move:\t" << (void*)&pre.at(0) << '\n';
std::cout << "pre-move:\t" << (void*)&pre.at(1) << '\n';

std::vector<B> post(std::move(pre));

std::cout << "post-move:\t" << (void*)&post.at(0) << '\n';
std::cout << "post-move:\t" << (void*)&post.at(1) << '\n';

return 0;
}

输出:

pre-move:   0x1d7b150 
pre-move: 0x1d7b154 <------|
post-move: 0x1d7b150 |
post-move: 0x1d7b154 <------|

最佳答案

vector 基本上只不过是指向堆分配内存的指针、 vector 的当前长度和当前容量。

通过“move ”一个 vector ,您所做的只是复制这些值,并重置移出的 vector 的值。

对于vector的数据,基本等同于

original_pointer = some_place_in_memory;
new_pointer = original_pointer; // Copies the *value* of original_pointer
original_pointer = nullptr;

无需分配新内存和复制 vector 中的数据。

关于c++ - vector 元素如何在 vector std::move 之后保留其原始地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53904835/

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