QByteArrayData笔记

QByteArrayData 的特点

  • 是 Qt 内部最高效的静态字符串表实现

  • 主要服务于:moc 生成的元数据、QStringLiteral、QMetaObject 的字符串表

  • 特点:内存紧凑、访问极快、不可变、安全

你平时写 Qt 代码基本不会直接用到它,但你看到的几乎所有 moc 生成的 qt_meta_stringdata_XXX_t 结构,核心就是靠 QByteArrayData 数组来描述字符串位置和长度

QByteArrayData = Qt 用来在二进制里高效存放一堆"编译期常量字符串"的元数据 + 偏移量结构,是现代 Qt 元对象系统性能和内存优化的关键基石。

QT_MOC_LITERAL宏

cpp 复制代码
#define QT_MOC_LITERAL(idx, ofs, len) \
    Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
      qptrdiff(offsetof(qt_meta_stringdata_MainWindow_t, stringdata0) + ofs \
               - idx * sizeof(QByteArrayData)) \
    )

定义

cpp 复制代码
struct qt_meta_stringdata_MainWindow_t {     
    QByteArrayData data[1];
    char stringdata0[11];
};

static const qt_meta_stringdata_MainWindow_t qt_meta_stringdata_MainWindow = {
    { 
        QT_MOC_LITERAL(0, 0, 10) // =>  QByteArrayData(-1, 10, 0, 16) => 实际数据"MainWindow"
    },     
    "MainWindow" 
};

QT_MOC_LITERAL(0, 0, 10)展开

cpp 复制代码
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(10, qptrdiff( offsetof(qt_meta_stringdata_MainWindow_t, stringdata0) + 0<ofs> - 0<idx> * sizeof(QByteArrayData) ) )

计算后

cpp 复制代码
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(10, 16)
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET宏
#define Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset) \
{ \
    /* ref     */ -1, \
    /* size    */ size, \
    /* alloc   */ 0, \
    /* offset  */ offset, \  // 实际字符串内容地址 - 当前这个QByteArrayData结构的地址 相当于 offset = &stringdata0[ofs] - &data[idx]
    /* (padding or future fields if any) */ \
}

QByteArrayData定义

cpp 复制代码
struct QByteArrayData {
    mutable qint32 ref; // 引用计数,静态时用 -1 
    qint32 size; // 字符串的字节长度(不含 \0) 
    qint32 alloc; // 通常 0(静态时无分配信息) 
    qint32 offset; // 指向真正 char 数据开始处的**相对偏移量** 
    // char data[]; // 柔性数组成员(实际数据跟在后面或通过偏移访问) 
};
相关推荐
luoyayun36131 分钟前
Qt + FFmpeg 实战:音频静音段检测
qt·ffmpeg·音视频·静音段检测
小短腿的代码世界1 小时前
Qt Quick 3D场景导入与渲染架构深度解析:从USD到PBR材质的完整管线
qt·3d·架构
小短腿的代码世界1 小时前
Qt文本布局引擎深度解析:从QTextDocument排版到渲染的完整架构
开发语言·qt·架构
小短腿的代码世界1 小时前
Qt Firebase集成深度解析:移动与嵌入式云后端解决方案
开发语言·qt
Rookie Linux2 小时前
使用Qt6 QML以及第三方库FluentUI、PCapPlusPlus开发一个自定义抓包软件
网络·c++·qt·cmake·qml
郝学胜-神的一滴2 小时前
Qt 高级开发 030:QListWidget 右键菜单全解,从策略配置到精准删除的优雅实现
开发语言·c++·qt·程序人生·用户界面
ytttr87319 小时前
Qt 数字键盘实现
开发语言·qt
hoiii18719 小时前
Qt 实现屏幕截图功能
开发语言·qt·命令模式
满天星830357720 小时前
【Qt】信号和槽(三) (断开连接和lambda函数)
qt
fpcc21 小时前
C++编程实践—C++实现类似Qt的信号槽机制
c++·qt