C++vector 的内存布局

 
Category: C_C++

写在前面

从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()