Qt信号槽关联中使用普通变量关联(包含不修改和修改槽内数据两种)、使用引用变量关联对于数据内部浅拷贝和深拷贝的测试结论

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/128336866

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

Qt开发专栏:概念


打印具体类型的方法

LOG << QString::number(reinterpret_cast<qintptr>(vectorTime.constData()), 16);

同一线程类,普通传递,变量不同,地址相同

../../xMonitorDemo/modules/hydrophoneProtocolManager/HydrophoneProtocolManager.cpp 226 "2022-12-15 22:39:10:348" "7f9e24012f08"
../../xMonitorDemo/modules/hydrophoneProtocolManager/HydrophoneProtocolManager.cpp 235 "2022-12-15 22:39:10:348" "7f9e24012f08"

不同线程类,普通传递,变量不同,地址相同

void signal_timeCurrentVoltage(QVector<double> vectorTime,
                               QVector<double> vectorCurrent,
                               QVector<double> vectorValue);
../../xMonitorDemo/modules/ampProtocolManager/AmpProtocolManager.cpp 1922 "2022-12-15 23:05:06:191" "7f306c00b558"
../../xMonitorDemo/modules/ampWidget/AmpWidget.cpp 475 "2022-12-15 23:05:06:192"                                  "7f306c00b558"

不同线程类,使用引用信号槽,变量不同,地址相同

void signal_timeCurrentVoltage(QVector<double> &vectorTime,
                               QVector<double> &vectorCurrent,
                               QVector<double> &vectorValue);
../../xMonitorDemo/modules/ampProtocolManager/AmpProtocolManager.cpp 1922 "2022-12-15 23:01:01:794" "7f9a5c0072f8"
../../xMonitorDemo/modules/ampWidget/AmpWidget.cpp 487 "2022-12-15 23:01:01:795"                                  "7f9a5c0072f8"

不同线程,普通传递,变量不通,地址相同,但是在目标后修改,则会导致深拷贝一份再修改(结论:只要不修改,就是隐式浅拷贝传递)

LOG << QString::number(reinterpret_cast<qintptr>(vectorTime.constData()), 16) << vectorTime.at(0);
vectorTime[0] = 1.234f;
LOG << QString::number(reinterpret_cast<qintptr>(vectorTime.constData()), 16) << vectorTime.at(0);
../../xMonitorDemo/modules/ampProtocolManager/AmpProtocolManager.cpp 1925 "2022-12-15 23:13:06:078" "7f4b50007058" 1.67112e+09
../../xMonitorDemo/modules/ampWidget/AmpWidget.cpp 475 "2022-12-15 23:13:06:079" "7f4b50007058" 1.67112e+09
../../xMonitorDemo/modules/ampWidget/AmpWidget.cpp 477 "2022-12-15 23:13:06:079" "557002bcb548" 1.234

  由以上可以判断 不论是否再信号槽中使用引用,是否跨线程,都不会导致其进行深拷贝,都是浅拷贝


测试结论:

  在信号槽的传递上:普通传递,引用传递和常量引用传递;
  1.信号槽使用普通传递:带结构的是隐式传递,会产生临时变量,默认就是隐式浅拷贝;
  2.信号槽使用引用传递:带结构的是隐式传递,会产生临时变量,是隐式浅拷贝(注意:这里可以被修改,只要不修改,就是隐式浅拷贝传递,修改则会临时深拷贝一次消耗深拷贝性能,不过一般传递基本不修改的,只做读取和解析)
  3.信号槽使用引用常量传递:带结构的是隐式传递,会产生临时变量,是隐式浅拷贝。


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/128336866

你可能感兴趣的:(Qt开发,Qt信号槽机制,信号槽传递引用变量,深拷贝浅拷贝)