【发布时间】:2015-01-05 10:09:24
【问题描述】:
我只是尝试优化一些通信堆栈。我正在使用 Qt 5.3.2 / VS2013。
堆栈使用 QByteArray 作为数据缓冲区。我打算使用capacity() 和reserve() 方法在数据大小增长时减少不必要的内部缓冲区重新分配。然而,QByteArray 的行为被证明是不一致的。保留的空间有时似乎被隐式压缩了。
我可以提取以下演示应用字符串追加、字符串分配和字符追加到三个缓冲区。这些单个操作似乎保留了内部缓冲区大小(使用capacity() 获得)。但是,当将这三个操作中的每一个应用于相同的 QByteArray 时,保留的大小会发生变化。这种行为在我看来是随机的:
QByteArray x1; x1.reserve(1000);
x1.append("test");
qDebug() << "x1" << x1.capacity() << x1;
QByteArray x2; x2.reserve(1000);
x2 = "test";
qDebug() << "x2" << x2.capacity() << x2;
QByteArray x3; x3.reserve(1000);
x3.append('t');
qDebug() << "x3" << x3.capacity() << x3;
QByteArray x4; x4.reserve(1000);
x4.append("test");
x4.append('t');
x4 = "test";
qDebug() << "x4" << x4.capacity() << x4;
预期的输出是:
x1 1000 "test"
x2 1000 "test"
x3 1000 "t"
x4 1000 "test"
但实际输出是:
x1 1000 "test"
x2 1000 "test"
x3 1000 "t"
x4 4 "test"
有人对这种奇怪的行为有解释吗?
更新:看起来clear() 也放弃了预订。
【问题讨论】:
-
请再看一遍... x2 使用相同的分配。这不是分配......不知何故,是导致问题的操作组合。
-
对。对于那个很抱歉。 x2 分配给一个已分配的空缓冲区,x4 重置缓冲区....
-
你认为这实际上是一种期望的行为吗?
-
我正在查看 QByteArray 中
operator=的代码......我不太了解其中的逻辑。它不适合您的用例,保留容量在很多情况下都不会保持。 (看看其他调整大小/截断的东西,看起来并不好。) -
(此外,如果您实际测量到这些分配会花费您,那么 QByteArray 的隐式共享模型的开销本身对于您的用例来说可能开销太大。)
标签: c++ qt memory-management qbytearray