std::vector元素是否分散存储?为何sizeof(vector)仅为24字节?
问题解答
首先明确两个核心结论:
- std::vector的元素是连续存储的,并非分散存储
sizeof(colour)计算的是vector对象本身的大小,不是它管理的所有元素的总大小
1. 为什么你的输出看起来像“分散存储”?
看你的运行结果,每个元素的地址依次是0x27b5a7c6220、0x27b5a7c6228、0x27b5a7c6230……相邻地址差8字节——这正好是64位系统下const char*类型的大小(指针占8字节)。这说明这些元素是连续排列的,只是因为单个元素本身占8字节,所以地址间隔为8,并不是分散存储。
2. 为什么sizeof(colour)是24字节?
std::vector的底层实现通常包含三个指针(以64位系统为例):
- 指向元素存储区起始位置的指针(8字节)
- 指向当前已存元素末尾的指针(8字节)
- 指向存储区容量末尾的指针(8字节)
三个指针总大小为3×8=24字节,这就是sizeof(colour)的结果。vector对象本身只负责管理这三个指针,真正的元素数据存储在它动态分配的堆内存中,这块内存的大小和vector对象本身的sizeof结果无关。
如果要计算所有元素的总大小,应该用colour.size() * sizeof(colour[0]),你的例子里就是6×8=48字节,这部分是vector动态分配的内存大小,不属于vector对象本身的sizeof计算范围。
补充验证代码
你可以在代码中添加一行,验证元素的连续性:
std::cout << "元素存储区起始地址: " << colour.data() << std::endl;
它的输出会和第一个元素的地址&colour[0]完全一致,进一步证明元素是连续存储的。
内容的提问来源于stack exchange,提问作者Meniev
相关产品推荐
相关产品推荐

