写在前面
从vector 的内存布局角度看代码.
#include <cstdint>
#include <iostream>
#include <vector>
using namespace std;
//typedef unsigned long uintptr_t;
int main() {
std::vector<int> v = {10, 20, 30};
v.reserve(10); // 设置 capacity 为 10
for (int i = 0; i < 3; ++i) {
cout << (void*)&v[i] << endl; // 打印每一个元素的地址
}
// 将 vector 对象的首地址强转为指向指针的指针 (uintptr_t*)
// 指向 vector 内部的前三个 8 字节区域
uintptr_t* ptr = reinterpret_cast<uintptr_t*>(&v);
uintptr_t start = ptr[0]; // _M_start
uintptr_t finish = ptr[1]; // _M_finish
uintptr_t end_stg = ptr[2]; // _M_end_of_storage
for (int i = 0; i < 3; ++i) {
cout << (void*)ptr[i] << endl;
}
// 计算 size 和 capacity (注意要除以元素类型的大小,或者用指针算术)
size_t calculated_size = (finish - start) / sizeof(int);
size_t calculated_cap = (end_stg - start) / sizeof(int);
std::cout << "Size: " << calculated_size << std::endl; // 输出 3
std::cout << "Capacity: " << calculated_cap << std::endl; // 输出 10
return 0;
}
结果
0x103211d90
0x103211d94
0x103211d98
0x103211d90
0x103211d9c
0x103211db8
Size: 3
Capacity: 10
____________________________
| 10 | 20 | 30 |
----------------------------
^ ^ ^ ^
0 8 16 24
begin() end() storage()