了解QVector append() - 为什么有条件地复制?

时间:2017-05-13 21:40:36

标签: c++ qt reference qvector

以下是来自github的QVector附加()的实现:

template <typename T>
void QVector<T>::append(const T &t)
{
    if (d->ref != 1 || d->size + 1 > d->alloc) {
        const T copy(t);
        realloc(d->size, QVectorData::grow(sizeOfTypedData(), d->size + 1, sizeof(T),
                                           QTypeInfo<T>::isStatic));
        if (QTypeInfo<T>::isComplex)
            new (p->array + d->size) T(copy);
        else
            p->array[d->size] = copy;
    } else {
        if (QTypeInfo<T>::isComplex)
            new (p->array + d->size) T(t);
        else
            p->array[d->size] = t;
    }
    ++d->size;
}

如果对向量的引用数量!= 1或者需要调整大小以及为什么只为这些条件制作副本,为什么需要复制t

已经询问了一个相关的问题here,但在代码中,在附加到基础数组之前总是会生成t的副本。

1 个答案:

答案 0 :(得分:3)

快速浏览一下,可能是因为if部分用于向量重新分配,而else部分用于何时不进行向量重新分配。当它重新分配时,用户可能已完成vector.append(vector[index]),在这种情况下t在重新分配后将变为无效,因此必须在重新分配之前进行复制。在没有重新分配的else部分t将保持有效,无需复制。