在现代 C++ 系统级开发与高性能网络通信中,原始字节流的高效处理是决定软件吞吐量与延迟表现的核心要素。作为 Qt 框架中用于承载和操作原始字节数组及 C 风格字符串的基础工具,QByteArray 的设计演进轨迹不仅折射出 C++ 语言标准的变迁,也代表了 Qt 核心架构向低开销、高安全性演进的决心。本报告针对 Qt 5.15(5.x 时代的终极长期支持版本)与 Qt 6.11(6.x 新一代演进版本)中的 QByteArray 进行全方位的深度对比,剖析其底层内存架构、寻址空间、轻量级视图机制、API 清理以及跨平台行为学差异,为企业级项目的重构与迁移提供权威、详实的技术参考。

底层内存架构与数据结构的重构

从 Qt 5.15 跨越至 Qt 6.11,QByteArray 经历了一场脱胎换骨的底层数据结构重构。这不仅改变了它的内存布局,还深刻影响了多类容器间的互操作性与代码的运行时安全。

从 QArrayData 到 QArrayDataPointer 统一架构

在 Qt 5.15 中,QByteArray 的物理支撑依赖于私有的、非模板化的 QArrayData 结构体。这种设计虽然通过复杂的偏移量计算和特定的类型转换实现了隐式共享(Copy-on-Write)和动态扩容,但由于缺乏统一的模板化泛型控制,导致 QByteArray、QString 以及 QVector(在 Qt 5 中与 QList 分立)之间的底层实现存在严重的壁垒,在容器间相互转换时往往难以避免昂贵的动态内存分配和内存拷贝。
进入 Qt 6 时代,开发团队重构了整个容器体系的基石。在 Qt 6.11 中,QString、QByteArray 以及统一后的 QList(由原 QVector 演进并作为其底层实现)全面转为采用泛型模板类 QArrayDataPointer<T>(针对 QByteArray 特化为 QArrayDataPointer<char>)进行内存统一管理。这一变革彻底打破了容器间的数据物理隔离,使这些最基础的字符串与字节容器在特定场景下能够实现真正意义上的零拷贝转换。
在行为细节上,这种架构统一也带来了一些向前兼容性妥协。例如为了兼顾存量代码的行为一致性,Qt 6.11 依然在头文件中保留并默认启用了 QT5_NULL_STRINGS 宏(其值定义为 1)。尽管这在学术上不够纯粹,但在工业实践中,它有效阻止了因“空字节数组”(Null QByteArray)与“空字符数组”(Empty QByteArray)在行为差异上产生的运行时崩溃。

内存初始化与 overwrite 性能优化

在缓冲区管理方面,QByteArray 的扩容和空间分配接口在 Qt 6 中得到了进一步细化。在 Qt 5.15 中,开发者在申请大段缓冲区时,通常只能调用 resize() 接口,而新分配的字节流内容是未定义的(存储着堆内存残留的脏数据),开发者随后必须通过物理覆盖或 fill() 进行清空,这对于追求极致性能的 I/O 数据流接收模块而言存在明显的冗余开销。
Qt 6.11 引入了更加符合现代高性能编程范式的 resizeForOverwrite(qsizetype size) 接口。该方法允许直接调整物理缓冲区的大小,同时向编译器和内存分配器明确宣告这部分空间不需要执行任何形式的初始化或填充操作,从而在后续立刻进行物理 I/O 写入(如直接通过套接字或文件句柄填充缓冲区)时,将数据准备阶段的 CPU 开销降至最低。

迭代器失效与引用稳定性的断层

数据结构的精简与性能的提升并非没有代价。在 Qt 5.15 中,非隐式共享状态下的修改操作在一定程度上对已持有的元素迭代器和引用提供了相对缓和的稳定性保护。然而,为了追求执行路径的绝对高效,Qt 6.11 重新定义了引用稳定性规范。
根据 Qt 6 的容器物理规范,除了官方文档明确声明的极少数例外,任何导致 QByteArray 尺寸(Size)或容量(Capacity)发生改变的操作(包括 insert()、remove()、append() 等方法),都必须被视为会使所有已保存的迭代器、内部裸指针(如 .data() 或 .constData())以及元素引用瞬间失效,即便该 QByteArray 实例当前处于单引用(未共享)状态。在多线程高频交互和复杂的回调逻辑中,未能遵守这一原则的代码会直接暴露在内存悬空(Dangling Pointer)与未定义行为(Undefined Behavior)的巨大风险之下。

寻址空间拓展与数据类型的重定义

随着海量数据处理、高吞吐网络解析以及超大文件读写逐渐成为工业界常态,32 位有符号整型在物理内存寻址上的局限性日益凸显。Qt 6.11 通过引入全新的尺寸与索引类型体系,彻底扫平了这一物理障碍。

关键规格属性 Qt 5.15 版本性能与规范 Qt 6.11 版本性能与规范
底层核心指针表示 基于非模板 QArrayData 基于模板特化 QArrayDataPointer<char>
底层存储空间间接寻址 存在两层指针间接寻址开销 指针及基础数据直接嵌于对象体中
默认空指针行为宏控制 隐式隔离空与未初始化状态 显式使能 QT5_NULL_STRINGS 维持兼容性
未初始化扩容安全支持 仅支持传统 resize(),无明确未初始化语义 支持原生 resizeForOverwrite() 极致性能扩展
高频迭代器稳定性规范 局部非共享状态下修改可能维持部分稳定性 任何物理尺寸变更操作皆强制判定所有引用失效

突破 2GB 内存配额壁垒

在 Qt 5.15 及其所有历史前代版本中,QByteArray 的大小、长度、索引和物理扩容参数均统一由 32 位有符号整型 int 承载。由于 int 的上限物理制约,QByteArray 单个实例的最大连续内存空间被牢牢锁死在:
最大空间限制 = 2 31 − 1  字节 ≈ 2  GB \text{最大空间限制} = 2^{31} - 1 \text{ 字节} \approx 2 \text{ GB} 最大空间限制=2311 字节2 GB
在雷达高速采集、高清视频无损 PCM 缓存或者大型点云序列反序列化等场景中,这一限制常年逼迫开发者放弃成熟的 Qt 核心类,转向物理控制极不安全的原始堆分配或第三方容器。
在 Qt 6.11 中,整个核心库容器层的数据寻址与大小类型全面重构为 qsizetype。在 64 位操作系统架构下,qsizetype 物理映射为 64 位有符号整型 ptrdiff_t(在 Qt 内部定义为 qssize_t)。这一重大变动直接将 QByteArray 的理论单实例最大物理寻址上限推升至 2 63 − 1 2^{63} - 1 2631 字节,使 Qt 在超大规模连续物理内存段的操作上能够完美融入现代 64 位硬软件生态。

编译期类型系统冲击与窄化警告

尽管向 qsizetype 的提升在物理架构上带来了显著优势,但在大型工程迁移中,它也是引发编译阻断的主要诱因。

// ⚠️ 在 Qt 5.15 下可编译,在 Qt 6.11 下会触发窄化转换警告或错误  
QByteArray networkBuffer = readNetworkData();  
int payloadSize = networkBuffer.size(); // size() 返回值已变更为 qsizetype

当存量代码中充斥着成千上万个使用 int 接收 size()、length()、indexOf() 返回值或作为循环条件边界的表达式时,现代 C++ 编译器(如 GCC 8+、Clang 9+ 及 MSVC 2019+)会基于更严格的类型安全检查,触发大面积的隐式窄化类型转换(Narrowing Conversion)警告甚至编译错误。为了应对这一断层,工程团队在迁移到 Qt 6.11 时,必须通过采用 auto 关键字自动推导、将索引类型物理提升至 qsizetype 或进行显式的 static_cast<int> 强转等手段,对代码进行系统性的类型安全修复。

QByteArrayView 的引入与轻量级只读视图范式

在高性能字符和字节数据解析场景(如 HTTP 协议栈、JSON/CBOR 序列化与反序列化等)中,频繁的堆内存申请与释放、隐式共享带来的写时复制惩罚是制约系统性能的隐形杀手。为此,Qt 6.0 引入并于 Qt 6.11 中完全确立了 QByteArrayView 这一具有里程碑意义的轻量级非拥有性(Non-owning)字节视图类。

物理本质与零开销参数传递机制

QByteArrayView 引用了一段物理上连续存储的只读原始字节序列,其自身在栈内存上仅占用一个指向物理数据首地址的指针和一个长度标识(共 16 字节),而不持有这部分内存的所有权。
它的核心设计初衷是作为函数的输入参数类型。在 Qt 5.15 中,为了让一个解析方法能够兼顾不同的字节输入源,库作者通常必须针对各种输入类型设计极其繁复的函数重载体系。而在 Qt 6.11 中,通过将参数声明为接收 QByteArrayView,一个函数接口便能零拷贝、统一地兼容以下所有的物理存储格式:

  • QByteArray 本身

  • 传统的 const char * 裸指针

  • 固定大小的字符数组 char (&)[Size]

  • 标准库中的 std::string_view、std::string

  • 包含 signed char、unsigned char 或 C++17 新增的 std::byte 连续容器(如 std::vector<std::byte>)

在物理传递上,QByteArrayView 必须采用传值(Pass-by-value)而非传引用(Pass-by-reference-to-const)的方式传递。在现代编译器和 ABI 规范下,仅占用 16 字节的轻量结构体能够直接塞入 CPU 寄存器中进行传递,这比将其作为引用(本质上是传递多重间接寻址的指针)具有更快的执行速度和更低的 CPU 流水线气泡。

编译期类型匹配守卫与兼容性隔离

为了确保零拷贝转换不会引发非预期的隐式模板递归,QByteArrayView 的头文件设计(如 IsContainerCompatibleWithQByteArrayView 等私有机制)体现了高超的现代 C++ 元编程技巧。

template <typename T>  
struct IsContainerCompatibleWithQByteArrayView : std::false_type {};

底层通过 IsCompatibleByteType 和 IsCompatibleByteArrayPointer 机制,严格过滤出仅允许 char、signed char、unsigned char 和 std::byte 参与重载匹配。更为关键的是,该机制显式排除了 QByteArray 以及 QByteArrayView 本身作为直接匹配容器(如通过 std::negation<std::is_same<…>>)。这不仅在编译期建立了坚实的静态安全守卫,防止因不当类型嵌套引发无限模板特化导致编译器崩溃,还杜绝了各种隐式的重分配漏洞。
此外,QByteArrayView 的迭代器实现遵循了只读语义,其定义的 iterator 与 const_iterator 均为同一只读类型。这种设计从类型系统层面阻断了任何试图通过迭代器修改只读物理内存的编译期尝试,极大提升了接口的健壮性。

视图 API 的规范化演进与异构查找

随着 Qt 6 的迭代演进,不仅只读视图本身在功能上愈发成熟(自 Qt 6.3 起,QByteArrayView 获得了免分配数值转换 API,如直接调用 toDouble()、toFloat()、toInt() 等,无需再物理构建 QByteArray):其裁剪行为也在 Qt 6.5 后迎来了更严苛的现代规范。
为了纠正历史命名的学术偏差并澄清“仅移动视窗而非产生内存拷贝”的物理本质,Qt 6.5 及之后的版本(包含 Qt 6.11)已全面弃用(Deprecated)QByteArrayView 内的 left()、mid() 和 right() 方法。新编写的工程代码应完全转向使用 first()、sliced() 以及 last() 系列切片算子,这三种新算子在运行时完全零拷贝,对高速网络数据头/尾解析和偏移切片具有无可比拟的性能优势。
此外,在 Qt 6.8 之后(进一步在 Qt 6.11 得到强化),通过 C++20 的异构查找(Heterogeneous Lookup)机制,QHash 能够在不创建临时 QByteArray 物理键的情况下,直接支持 QByteArray 与 QByteArrayView 键值对的高效哈希异构寻址。

行为学变更、API 清理与多平台深度融合

除了数据结构和尺寸类型的重构,QByteArray 在具体方法重载、隐式转换、字符编码控制以及多平台融合层面也展现出了崭新的行为特征。

阻断 QString 的隐式 UTF-8 自动追加

在 Qt 5.15 中,QByteArray 存在一个极其宽松但饱受技术指摘的隐式转换接口:append(const QString &str)。当开发者不慎将 QString 传递给此接口时,底层会在静默状态下自动调用 QString::toUtf8() 进行编码转码,随后拼接至字节数组中。这种“便利”在现实工程中带来了两大致命硬伤:一是导致对字符编码不敏感的开发者频繁写出非预期乱码的代码;二是在高性能解析路径中引入了极其昂贵、且难以在静态分析阶段被轻易察觉的运行时隐式转码与动态分配开销。
在 Qt 6.11 中,所有这些隐式跨编码追加的宽泛重载被全部阻断。任何试图将 QString 追加到 QByteArray 或在两者之间执行隐式强制转换的行为都将直接触发编译失败。开发者必须清晰、显式地标明其字符集编解码意图:

QByteArray dataBuffer;  
QString textMessage = "UserText";

// ❌ 在 Qt 6.11 下直接编译报错,阻断隐式开销   
dataBuffer.append(textMessage); 

//  正确、显式的现代标准写法     
dataBuffer.append(textMessage.toUtf8()); 

头部插入(Prepend)的算法复杂度飞跃

在字节追加操作中,头部插入(Prepend)历来是性能优化的重灾区。在 Qt 5.15 中,向 QByteArray 的头部插入数据是一项算法复杂度为线性时间 O ( N ) O(N) O(N)的极其低效的操作(其中 N N N 为当前字节数组的物理长度)。这是因为其底层结构设计仅支持尾部缓冲区预留,每次头部插入都会迫使整个内存块在堆上向后发生全局平移。
得益于 QArrayDataPointer 统一底座带来的物理对齐,Qt 6.11 中的 QByteArray 获得了与 Qt 5 中 QList 相似的头部缓冲区物理预留机制。这直接使得 QByteArray::prepend 在数据物理结构层面的性能产生了质的飞跃,其均摊算法复杂度跃升为:
均摊算法复杂度 Qt 6 Prepend = Amortized  O ( 1 ) \text{均摊算法复杂度}_{\text{Qt 6 Prepend}} = \text{Amortized } O(1) 均摊算法复杂度Qt 6 Prepend=Amortized O(1)
对于逆向序列化、流式协议头组装以及高频接收无序网络帧并物理重组的工业算法,该机制带来了数倍至数十倍的瞬时吞吐量红利。

现代 C++ 规范化与已弃用 API

为了维护现代 Qt 架构的敏捷性,Qt 6.11 对已经过时、易引发歧义的非成员函数及成员函数进行了彻底清理:

  • qsizetype QByteArray::count() const 的弃用:该无参版本由于其物理行为与 size() 及 length() 完全重合,在 Qt 6.4 后被正式废弃,强烈建议全面替换为标准的 size()。
  • 格式化辅助函数 qsnprintf 与 qvsnprintf 的弃用:由于其跨平台行为差异极大,且在 WebAssembly、Android 平台对 %a(十六进制浮点)及 %ls(宽字符)的支持存在严重歧义,这两者在 Qt 6.9 中已被标记为废弃。推荐使用标准 C++11 的 std::snprintf() 或 Qt 自身的 QString::asprintf()。
  • operator""_qba 算子的更替:在 Qt 6.2 中引入的用于快速构造物理只读字节数组的字面量算子 operator""_qba,在 Qt 6.8 后被废弃。统一推荐转向使用更具标准语义的 Qt::StringLiterals 命名空间下的 _ba 算子。

极致 C 风格安全保障:nullTerminate 与 nullTerminated

尽管 QByteArray 能够保存包含嵌入式 \0 的任意二进制原始数据,但在与底层操作系统接口、第三方纯 C 库交互时,尾部空终止符 \0 的物理完整性是避免缓冲区溢出(Buffer Overflow)安全漏洞的关键屏障。
为了解决由于从外部裸数据构造 QByteArray(如调用 fromRawData())时,物理内存尾部可能缺失空终止符的安全隐患,Qt 6.10/6.11 引入了 nullTerminate() 与 nullTerminated() 方法。在不确定字节流尾部是否已安全零化时,开发者可以通过调用 nullTerminate() 确保底层物理内存追加零终止符。这一操作能够安全地避开不必要的深拷贝检测,极大方便了与底层 POSIX 系统调用的交互,并能通过 nullTerminated() 快速进行无开销的零检查。

多平台融合生态:从 WebAssembly 到 Apple/Andorid 系统

作为跨平台框架的排头兵,Qt 6 极大地增强了 QByteArray 在各类主流以及新兴平台上的物理集成便利度:

  • WebAssembly (WASM) 运行沙箱融合:在 WASM 环境下,由于浏览器文件系统的沙箱物理隔离,传统的文件 URL 读取无法直接交付给多媒体等组件。针对此场景,Qt 6 WASM 框架中获取的本地文件直接以 QByteArray 形式安全交付。 在底层转换上,QByteArray 新增了 fromEcmaUint8Array(emscripten::val) 物理接口:允许将 JavaScript 环境下的 Uint8Array 零拷贝(或高能效)转换为 QByteArray,打通了浏览器原生堆内存与 WebAssembly 堆内存之间的边界。
  • Apple 系统原生数据交互:在 macOS/iOS 编译环境下,QByteArray 原生提供了 fromCFData()fromRawCFData()fromNSData() 以及 fromRawNSData() 物理转换接口,完美对接 Apple Foundation 层的 CFDataRef 与 NSData 原生系统句柄,实现了无需二次动态分配的高性能跨框架数据桥接。
  • Android 生态增强:配合 Android 平台的 JNI 与 JVM 数据通信,QByteArray 的序列化支持在 Qt 6.11 下变得更为敏捷,能够顺畅地流转于各类原生强类型嵌入式 Activity 之间。

内存流媒体桥梁:QBuffer 与 QByteArrayList 的演进

在内存级二进制流读写中,QBuffer 扮演了将 QByteArray 桥接至 QIODevice 抽象接口的核心通道角色。

QByteArray dataPayload;  
QBuffer ioBridge(&dataPayload);  
ioBridge.open(QIODevice::WriteOnly); // 无需物理文件即可在内存中进行流媒体读写

由于 QBuffer 自身并不接管底层 QByteArray 的生命周期,这种设计极大地便利了开发者使用 QDataStream 或 QTextStream 以内存数据库的形式进行高频序列化。与之相呼应的,是专门用于拼接海量二进制大对象(BLOB)的 QByteArrayList 容器。与专门用于处理可打印字符、包含大量复杂排序过滤逻辑的 QStringList 相比,QByteArrayList 在 Qt 6.11 中依然保持着其极简纯物理、专供高速拼接的定位。更值得注意的是,Qt 6.3 专门为其新增了接收 QByteArrayView 间隔符的 join() 重载。由于拼接过程中不需要重复构造临时的间隔字符数组,拼接海量字节序列的速度较 Qt 5 提升了数倍。

典型 API 重载与方法签名变迁对比矩阵

下面提炼了从 Qt 5.15 到 Qt 6.11 版本,典型成员函数与核心 API 在重载形式、参数及返回类型上的详细演进变化:

典型成员方法与核心 API Qt 5.15.x 版本重载签名特征 Qt 6.11.x 物理签名特征与演进机制
基础构造函数 QByteArray(const char *data, int size = -1) QByteArray(const char *data, qsizetype size = -1) QByteArray(QByteArrayView v) (自 6.8 显式使能)
字符定位 at() char at(int i) const char at(qsizetype i) const
元素追加 append() QByteArray &append(const QString &str) QByteArray &append(const char *str, int len) 物理废弃 QString 重载 QByteArray &append(QByteArrayView data) QByteArray &append(const char *str, qsizetype len)
区间擦除 erase() 未提供高效迭代器擦除 iterator erase(const_iterator first, const_iterator last) (自 6.1) iterator erase(const_iterator it) (自 6.5)
数据赋值 assign() 未提供统一数据赋值 QByteArray &assign(QByteArrayView v) (自 6.6) QByteArray &assign(InputIterator first, InputIterator last) (自 6.6)
子串查询 indexOf() int indexOf(const QString &str, int from = 0) const int indexOf(const QByteArray &ba, int from = 0) const 废弃 QString 查询接口 qsizetype indexOf(QByteArrayView bv, qsizetype from = 0) const
哈希散列辅助 qHash() uint qHash(const QByteArray &key, uint seed = 0) size_t qHash(const QByteArray &key, size_t seed = 0) (64位哈希保护)
十六进制解析 fromHex() QByteArray fromHex(const QByteArray &hexEncoded) QByteArray fromHex(QByteArrayView hexEncoded) (零分配解析视图)

迁移重构指南与工程实践最佳路径

对于正处于 Qt 5.15 代码库向 Qt 6.11 LTS 跨越式迁移通道中的研发团队而言,围绕 QByteArray 开展的系统性重构工作既是消除编译告警的核心战场,也是挖掘运行时系统性能红利的黄金窗口。以下提炼出在真实工程环境下应当贯彻的四项核心重构实践。

诊断并阻断析构崩溃(~QByteArray Segment Fault)

在迁移重构早期阶段,部分研发团队会在包含 QByteArray 析构、返回局部字节变量的复杂执行路径中,遭遇令人费解的段错误(Segmentation Fault)崩溃。
分析表明,该问题的物理本质并非 Qt 6 底层代码存在漏洞,而是由于研发团队在大型工程中错误混用了 Debug 与 Release 模式下的物理二进制模块。由于 Qt 6 的 QArrayDataPointer 统一了底座并采用了极其敏捷的指针直接释放管理,Debug 与 Release 构建下的物理堆内存结构有着根本性的分配尺寸差异。如果应用的主程序(Debug)加载了 Release 构建的第三方 Qt 动态链接库,在调用 ~QArrayDataPointer() 析构分配在其上的字节数组时,会因内存堆对齐错误触发操作系统内核的堆保护机制,产生难以定位的崩溃。因此,工程重构的首要任务是必须实施彻底的清理与构建环境隔离,确保整个依赖树的二进制兼容性(ABI)绝对一致。

全面采用静态断言与元编程守卫重写高频 API

为了彻底消灭由于 qsizetype 寻址拓展引入的几万个窄化转换告警,应当贯彻如下的重构操作:

  • 避免在循环计数和下标遍历中显式使用 int
  // ❌ 存在窄化隐患的传统遗留写法  
  for (int i = 0; i < dataPayload.size(); ++i) { process(dataPayload[i]); }
  
  //  符合现代 C++20 与 Qt 6 规范的高性能重构写法     
  for (qsizetype i = 0; i < dataPayload.size(); ++i) { process(dataPayload[i]); }  
  // 或者直接使用基于范围的 for 循环(Range-based for)     
  for (char byteValue : dataPayload) { process(byteValue); }
  • 重构外部 C 函数的数据接口:在必须将 QByteArray::size() 传递给接收 int 或 size_t 的第三方底层库(如 OpenSSL 或特定解密硬件驱动)时,不要依赖编译器的隐式窄化转码,而应当通过显式的静态断言或物理转码进行安全约束:
  // 显式断言边界安全并强转,抵御溢出风险     
  Q_ASSERT(dataPayload.size() <= std::numeric_limits<int>::max());  
  thirdParty_legacy_API(dataPayload.constData(), static_cast<int>(dataPayload.size()));

实施极致零分配:用 QByteArrayView 替换只读形参

重塑所有内部模块的数据交互通道,这是大幅减少数据链路动态内存分配的最佳工程路径:

  • 清理只读函数重载:在任何需要只读字节流的地方,将所有的形参: void processData(const QByteArray &array)void processData(const char *rawData, int len) 统一重构重写为: void processData(QByteArrayView dataView)

  • 确保数据生命周期安全:在将参数改为 QByteArrayView 传递后,需要对包含高频回调、异步槽函数执行的异步执行路径进行深度生存期审计。必须保证在只读视图存续期间,底层的字节拥有者容器(如原生的 QByteArray)不会因为析构、超出局部作用域或发生修改(导致物理内存重分配)而退化为虚空悬挂指针。若代码路径存在无法完全预知、不可控的重分配操作,必须通过调用视图的 .toByteArray() 强行物理克隆出一个拥有物理控制权的本地实例来锁死内存生存期。

严防由于物理扩容导致的隐式迭代器悬空

大型工程重构中,另一项必须重点防御的物理漏洞在于由于扩容行为造成的物理重分配和指针失效。
在 Qt 5.15 下能够侥幸过关的代码,在 Qt 6.11 极致追求性能的重分配器下会迅速暴露隐患:

// ❌ 存在致命悬挂漏洞的错误用法  
QByteArray dataContainer = "PacketHeader:";  
const char *packetBeginPtr = dataContainer.constData(); 

// ⚠️ 该物理追加可能会由于触发预留空间不足,导致整段物理内存发生全局堆迁移!  
dataContainer.append(readSocketPayload()); 

// 💥 此时 packetBeginPtr 可能已指向被系统标记回收的野内存段!  
parseHeader(packetBeginPtr); 

重构的工程规约应当严格规定:在对 QByteArray 进行任何可能改变尺寸、容量的操作之后,凡是先前已经解析并暂存的裸指针、参考引用以及各类内部迭代器,必须立即全部废弃并重新初始化。这种规约虽然在编码控制上增加了心智负担,但能换来极高可靠、坚固且无懈可击的高性能应用。

引用的著作
  1. QByteArray Class - Developpez.com, https://qt.developpez.com/doc/6.6/qbytearray/
  2. File and Datastream Functions | Qt Core | Qt 6.11.1 - Qt Documentation, https://doc.qt.io/qt-6/io-functions.html
  3. Changes to Qt Core - Qt Documentation, https://doc.qt.io/qt-6/qtcore-changes-qt6.html
  4. QByteArray Class Reference, https://doc.bccnsoft.com/docs/PyQt4/qbytearray.html
  5. Porting to Qt 6 | Qt 6.11 - Qt Documentation, https://doc.qt.io/qt-6/portingguide.html
  6. New Features in Qt 6.0 - Qt Wiki, https://wiki.qt.io/New_Features_in_Qt_6.0
  7. QtCS2017 QtCore - Qt Wiki, https://wiki.qt.io/QtCS2017_QtCore
  8. QList changes in Qt 6, https://www.qt.io/blog/qlist-changes-in-qt-6
  9. [Development] User-defined literals for QString (and QByteArray), https://lists.qt-project.org/pipermail/development/2021-March/041106.html
  10. Changes to Qt Core - Felgo, https://felgo.com/doc/qt/qtcore-changes-qt6/
  11. qbytearray.h source code [qtbase/src/corelib/text/qbytearray.h] - Codebrowser, https://codebrowser.dev/qt6/qtbase/src/corelib/text/qbytearray.h.html
  12. [Development] QString and related changes for Qt 6 - Mailing Lists, https://lists.qt-project.org/pipermail/development/2020-May/039455.html
  13. PySide6.QtCore.QByteArray - Qt for Python, https://doc.qt.io/qtforpython-6/PySide6/QtCore/QByteArray.html
  14. List of All Members for QByteArray | Qt Core | Qt 6.11.0 - Qt Documentation, https://doc.qt.io/qt-6/zh/qbytearray-members.html
  15. QBuffer Class | Qt Core | Qt 6.11.1, https://doc.qt.io/qt-6/qbuffer.html
  16. QByteArray Class Maximum size and out-of-memory conditions is 2GB?? - Qt Forum, https://forum.qt.io/topic/134995/qbytearray-class-maximum-size-and-out-of-memory-conditions-is-2gb
  17. QByteArray Class | Qt Core 5.7 - MIT, https://stuff.mit.edu/afs/athena/software/texmaker_v5.0.2/qt57/doc/qtcore/qbytearray.html
  18. Qt: Fix compilation on Qt5 and clang (!11709) · Merge requests - GitLab, https://gitlab.com/wireshark/wireshark/-/merge_requests/11709
  19. Qt 6 WASM: Uploading & Playing Back Audio Files - KDAB, https://www.kdab.com/qt-6-wasm-uploading-playing-back-audio-files/
  20. QByteArray Class | Qt Core | Qt 6.11.1, https://doc.qt.io/qt-6/qbytearray.html
  21. Qt 5 to Qt 6 migration: a step-by-step tutorial - Spyrosoft, https://spyro-soft.com/expert-hub/qt5-to-qt-6migration-step-by-step
  22. Cutelyst - The Qt Web Framewok, https://cutelyst.org/blog
  23. QBinaryJson Namespace | Qt 5 Core Compatibility APIs | Qt 6.11.1, https://doc.qt.io/qt-6/qbinaryjson.html
  24. QByteArrayView Class - Developpez.com, https://qt.developpez.com/doc/6.2/qbytearrayview/
  25. QByteArrayView Class | Qt Core | Qt 6.11.1, https://doc.qt.io/qt-6/qbytearrayview.html
  26. qbytearrayview.h source code [qtbase/src/corelib/text/qbytearrayview.h] - Codebrowser, https://codebrowser.dev/qt6/qtbase/src/corelib/text/qbytearrayview.h.html
  27. QByteArrayList Class | Qt Core | Qt 6.11.1, https://doc.qt.io/qt-6/qbytearraylist.html
  28. Obsolete Members for QByteArrayView | Qt Core | Qt 6.11.1, https://doc.qt.io/qt-6/qbytearrayview-obsolete.html
  29. What’s New in Qt 6.8, https://doc.qt.io/qt-6/whatsnew68.html
  30. Qt - QStringList to QByteArray - Stack Overflow, https://stackoverflow.com/questions/41759371/qt-qstringlist-to-qbytearray
  31. C++ API changes | Qt 5.7 - MIT, https://stuff.mit.edu/afs/athena/software/texmaker_v5.0.2/qt57/doc/qtdoc/sourcebreaks.html
  32. Qt C++ QString to QByteArray Conversion - Stack Overflow, https://stackoverflow.com/questions/37802575/qt-c-qstring-to-qbytearray-conversion
  33. Migrating from Qt 5 to Qt 6 - Bryan Cairns (VoidRealms) - Medium, https://bcairns.medium.com/migrating-from-qt-5-to-qt-6-ef6eda65c00b
  34. Obsolete Members for QByteArray | Qt Core | Qt 6.11.1, https://doc.qt.io/qt-6/qbytearray-obsolete.html
  35. What’s New in Qt 6.10 - Qt Documentation, https://doc.qt.io/qt-6/whatsnew610.html
  36. List of All Members for QByteArray | Qt Core 6.8.7, https://doc.qt.io/qt-6.8/ja/qbytearray-members.html
  37. QByteArrayList Class | Qt Core | Qt 6.11.1 - Qt Documentation, https://doc.qt.io/QT-6/qbytearraylist.html
  38. Qt6 Migration: Upgrade Your GUI with Expert Tips - Witekio, https://witekio.com/blog/how-to-successfully-migrate-to-qt6/
  39. Porting from Qt 5 to Qt 6 – Top 3 reasons and steps to follow - Somco Software, https://somcosoftware.com/en/blog/porting-from-qt-5-to-qt-6
  40. .readAll succeed but Segmentation fault on ~QByteArray when function return | Qt Forum, https://forum.qt.io/topic/142772/readall-succeed-but-segmentation-fault-on-qbytearray-when-function-return
  41. Crash when creating QT QList - c++ - Stack Overflow, https://stackoverflow.com/questions/78977378/crash-when-creating-qt-qlist
  42. Heap corruption when Enumerating QActions in a QMenu in 6.8.1 | Qt Forum, https://forum.qt.io/topic/160064/heap-corruption-when-enumerating-qactions-in-a-qmenu-in-6-8-1
  43. Convert QByteArray to uint8_t*(uint8_t array) - c++ - Stack Overflow, https://stackoverflow.com/questions/75306635/convert-qbytearray-to-uint8-tuint8-t-array
Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐