为何QList对象的sizeof()返回值始终为4字节?
为什么QList对象的sizeof()结果不随元素数量/类型变化?
哈哈这个问题问到Qt容器设计的精髓上了!咱们一步步说清楚:
首先得纠正一个误区:你测的不是元素的总大小
你用sizeof(QList<T>)拿到的,根本不是所有元素占的内存总和,而是QList这个"对象本身"的内存大小。QList本质上是个「轻量级句柄」,它自己不存元素,只存几个用来管理实际数据的小玩意儿。
QList对象到底存了啥?
在32位系统下,这个句柄刚好是4字节(64位系统一般是8字节),里面主要就是:
- 一个指向堆上共享数据块的指针(这就是占了4字节的核心)
- 有些实现里会把元素数量、数据块容量这些信息也塞进句柄,但打包后还是4字节;也有的实现把这些信息存在共享数据块里,句柄就只剩一个指针。
真正的元素数据,全存在堆上的那个共享缓冲区里,和QList对象本身完全是分开的两个东西。
为啥元素数量/类型改了都不影响?
- 改元素数量:无非是往共享数据块里加元素、删元素,或者扩容时重新分配堆上的缓冲区,但QList对象手里的那个句柄(指针+小元数据)大小根本不会变——就像你换了个更大的快递箱子,但你手里的取件码纸条大小还是一样的。
- 换元素类型:不管你存
int还是QString,QList这个句柄的结构都是一模一样的,只是它指向的共享数据块里存的东西变了而已。就像取件码纸条不管对应啥快递,纸条本身大小不变。
给你写个代码例子直观感受下
QList<int> emptyList; QList<QString> hugeList; // 往hugeList塞1000个字符串 for (int i = 0; i < 1000; ++i) { hugeList.append(QString::number(i)); } // 在32位系统下,这俩的sizeof结果都是4字节 qDebug() << "emptyList size:" << sizeof(emptyList); qDebug() << "hugeList size:" << sizeof(hugeList);
额外说一句:这是Qt隐式共享的功劳
这种设计就是Qt的**隐式共享(也叫写时复制)**机制,好处贼大:复制QList的时候根本不用拷贝所有元素,就复制个4字节的句柄就行,只有当你修改其中一个列表时,才会真正复制数据。既省内存又提性能,简直是Qt容器的灵魂设计之一!
内容的提问来源于stack exchange,提问作者AAEM
相关产品推荐
相关产品推荐

