You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:02:58