Qt-注意隐式共享机制

最佳实践:

  1. 隐式共享对STL样式的迭代器有另一个影响:当迭代器在该容器上处于活动状态时,应避免复制容器。 迭代器指向内部结构
  2. 不要在使用了隐式数据共享的容器上,在有非 const STL 风格的遍历器正在遍历时复制容器
#include <QCoreApplication>
#include <QVector>
#include <QtDebug>


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QVector<quint32> vec {10, 20, 30};
    QVector<quint32> m_vec = vec;

    m_vec[0] = 100;

    qDebug() << vec; // vec不变
    qDebug() << m_vec; // m_vec变化

    return a.exec();
}

如果定义了一个迭代器,修改了迭代器指向的值,而其中并没有触发copy on write 机制,这是非常奇怪的现象。避免出现这样的用法

#include <QCoreApplication>
#include <QVector>
#include <QtDebug>


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QVector<quint32> vec {10, 20, 30};
    auto ver_iter = vec.begin(); // notice!!!
    QVector<quint32> m_vec = vec;

    *ver_iter = 100; // m_vec中的数据也被修改了

    qDebug() << vec;
    qDebug() << m_vec;

    return a.exec();
}

但是修改代码的顺序后,又有不同的现象,这是很有迷惑性的。


#include <QCoreApplication>
#include <QVector>
#include <QtDebug>


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QVector<quint32> vec {10, 20, 30};
    QVector<quint32> m_vec = vec;

    auto ver_iter = vec.begin();
    *ver_iter = 100; // 仅仅vec改变,m_vec没有改变

    qDebug() << vec;
    qDebug() << m_vec;

    return a.exec();
}

参考文档:
https://www.cnblogs.com/MakeView660/p/11398174.html
https://www.devbean.net/2013/01/qt-study-road-2-implicit-sharing/

posted @ 2020-08-22 08:54  duohappy  阅读(287)  评论(0编辑  收藏  举报