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[]; // 柔性数组成员(实际数据跟在后面或通过偏移访问)
};
