这个代码会使这些向量对齐吗

Will this code make those vector aligned?

本文关键字:向量 对齐 代码      更新时间:2023-10-16

假设我有:

vector<T *> vect;

我知道这不是显而易见的方法,但我有一个API可以做到这一点,所以我不能决定使用vector<T>

所以当我把物体放进去时,我会这样做:

vect.push_back(new T);

这段代码会确保这个向量是对齐的连续的,因为它是指针的向量吗?这个容器会决定new操作符的行为吗?

编辑:我还需要打电话给delete吗?

这段代码会确保这个向量是对齐的吗,因为它是指针的向量

不确定在这种情况下,您对对齐的理解是什么,但这种情况类似于指针数组,其中每个指针都被分配了动态内存。指针数组位于连续的位置,每个指针都指向堆上某个位置的内存
这同样适用于指针元素的矢量。

我是否也需要在这些问题上呼叫delete

是的,您需要显式地对这些元素中的每一个调用delete
在元素是指针的情况下,标准库容器不负责释放元素的内存。

阅读良好:
vector::erase()是否会破坏删除的对象

您想要将许多T*推入向量中,以便指向的对象是连续的。不同的T*会在一起,但你也希望T对象在一起。如果你提前知道物品的数量,你可以这样做:

T* arr = new T[N];
for(int i = 0; i<N; ++i) {
    vect.push_back(&(arr[i]));
}

要删除,必须调用delete[] vect[0];。您只对第一个项目调用delete。如果你delete其他人,你会得到不明确的行为。

(我仍然不知道为什么你希望它们是连续的。)

指针在内存中是连续的,就像一样

 T* array[]

这是由标准保证的。然而,矢量将在特定的操作(如增长容量)上重新分配;这个标准也很好地定义了这一点。读取

 std::vector<>::resize
 std::vector<>::reserve
 std::vector<>::capacity
 std::vector<>::size

只要不触发重新分配,就可以像对待数组一样对待向量。

链接:http://en.cppreference.com/w/cpp/container/vector/reserve