这个代码会使这些向量对齐吗
Will this code make those vector aligned?
假设我有:
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
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 向量对到数组
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 创建单词对齐的字符向量
- C++轴对齐的矩形操作向量和字符串
- SSE 向量的对齐和未对齐加载和存储 - 如何减少代码重复
- 字节向量到十六进制字符串流 DWORD 对齐
- 这个代码会使这些向量对齐吗
- 对齐数据类型Eigen::矩阵的数组或向量声明