Qt-注意隐式共享机制
作者:互联网
最佳实践:
- 隐式共享对STL样式的迭代器有另一个影响:当迭代器在该容器上处于活动状态时,应避免复制容器。 迭代器指向内部结构
- 不要在使用了隐式数据共享的容器上,在有非 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/
标签:argc,Qt,QVector,int,argv,vec,共享,include,隐式 来源: https://www.cnblogs.com/zhouww/p/13544325.html