【问题标题】:QByteArray:: append() leads to memory reallocationQByteArray::append() 导致内存重新分配
【发布时间】:2015-12-15 02:48:42
【问题描述】:

我注意到在某些情况下执行以下代码后

void appendToArray(QByteArray &array, const char *source, int size) {
    void *p1 = array.data();
    array.append(dest, size);
    void *p2 = array.data();
}

p1 和 p2 变得不同。但我一直认为 append() 方法“一开始”不会影响内部 QByteArray 内存——它只是将一些字节附加到对象的末尾;我错了吗?

【问题讨论】:

标签: c++ qt dynamic-memory-allocation qbytearray


【解决方案1】:

最好不要假设指针在append() 上不会改变。

QByteArray在数据之后预先分配了一些空间,但是超过之后,它使用realloc,它可以或不能仅仅扩展数据缓冲区,具体取决于缓冲区后是否存在空闲内存。

如果缓冲区后没有空闲内存,它会为你分配一块新的内存,所以有问题的指针会改变。

UPD:正如在 cmets 中提到的 N1ghtLight,您可以依靠指针位置,以防在执行 append() 之前使用 reserve() 方法分配足够的内存。

【讨论】:

    【解决方案2】:

    我一直认为 append() 方法“一开始”不会影响内部 QByteArray 内存——它只是将一些字节附加到对象的末尾;我错了吗?

    在某种程度上,你是对的。 append() 不影响数组数据开头的内容。但它有时可以(而且必须)将未更改的数据移动到更大的块中。

    data() 改变了并不意味着 内容 改变了!

    【讨论】:

      【解决方案3】:

      来自 QByteArray 文档页面 (http://doc.qt.io/qt-4.8/qbytearray.html)

      当您 append() 数据到非空数组时,该数组将是 重新分配并将新数据复制到其中。

      这可能不会一直发生,因为数组可能分配了足够的内存来存储新项目。但是,当它需要获得更多空间来存储更多数据时,它会为整个数组重新分配内存并复制现有数据。这样它就可以维护一个连续的数据数组。

      【讨论】:

      • 我不知道我提前需要多少空间,如何使用 QByteArray 或您可能建议使用的任何其他兼容的二进制数据结构来缓解内存重定位问题。 P.S 我可能需要增量分配大量的二进制数据,而性能至关重要?
      • 如果您的数据不需要连续,您可以使用std:deque 容器之类的东西。这会根据需要分配数据块,并且不会导致重新分配和移动。如果您确实需要使用 QByteArray,那么您可以猜测您需要多少并使用 reserve
      猜你喜欢
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 2012-11-12
      • 2011-02-18
      • 1970-01-01
      • 2020-11-04
      • 2015-01-05
      相关资源
      最近更新 更多