QT 隐式共享机制对STL样式迭代器的影响

最佳实践:

  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/

转自:https://www.cnblogs.com/zhouww/p/13544325.html

其它线程文章:

QT 初识线程(简单实现):https://blog.csdn.net/qq_37529913/article/details/110127940

QT QMutex使用详解:https://blog.csdn.net/qq_37529913/article/details/110187452

QT 线程之QSemaphore(深入理解):https://blog.csdn.net/qq_37529913/article/details/110187121

QT线程 Emit、Sgnals、Slot详细解释:https://blog.csdn.net/qq_37529913/article/details/110211435

QT 线程之QWaitCondition(深入理解):https://blog.csdn.net/qq_37529913/article/details/110212704

Qt 多线程之线程事件循环(深入理解):https://blog.csdn.net/qq_37529913/article/details/110229382

QT线程之QObjects(深入理解):https://blog.csdn.net/qq_37529913/article/details/110228837

QT线程之可重入与线程安全(深入理解):https://blog.csdn.net/qq_37529913/article/details/110224166

QT之浅拷贝、深拷贝、隐式共享(深度理解必看文章):https://blog.csdn.net/qq_37529913/article/details/110235596

QT 隐式共享机制对STL样式迭代器的影响:https://blog.csdn.net/qq_37529913/article/details/110252454

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值