OpenCV Mat::operator=-是否支持写时复制
OpenCV Mat::operator= - does it support copy on write?
从OpenCV文档中,复制矩阵似乎是使用浅拷贝完成的,但当更改其中一个拷贝时,就完成了拷贝。
确切的参考是:
Mat& Mat::operator = (const Mat& m) Mat& Mat::operator = (const MatExpr_Base& expr) Mat& operator = (const Scalar& s)
矩阵赋值运算符
参数:
m–指定的右侧矩阵矩阵赋值为O(1)操作,即不复制任何数据。相反,数据是共享的参考计数器(如果有)递增分配新之前数据,旧数据通过Mat::释放。
expr–指定的矩阵表达式对象与第一种形式相反分配操作的第二个表单可以重用已分配的矩阵,如果它有合适的大小和键入以适应矩阵表达式后果它由自动处理矩阵的实函数表达式扩展为。For例如,C=A+B扩展为cv::add(A,B,C)和add()自动C重新分配。
s–标量,分配给每个矩阵元素。矩阵大小或类型未更改。
然而,这似乎不起作用
Mat_<float> a(5,5),b(5,5);
a =1;
b = a;
a = 2;
现在b==2,1 的整数
你好像误解了"在分配新数据之前,通过Mat::release取消对旧数据的引用"并不意味着在a
或b
上写入时会发生复制。这意味着当您键入b=a
时,您将丢失b.中的数据
长话短说:不支持书面复制。
您可以使用Mat::copyTo()
进行深度复制。例如
Mat a(5,5,CV_32C1),b;
a = 1;
a.copyTo(b);
a = 2;
但不支持,Mat
不支持写时复制。当您需要在不影响b
的情况下更改a
时,您需要将a
深度复制到b
,然后修改a
。
相关文章:
- MSVC是否支持C++11样式的属性而不是__declspec
- 如何检测VS C++编译器是否支持C++11?
- LMDB 是否支持随机读取?
- Vulkan 的传输队列系列功能和显卡支持:条件检查是否准确?
- OpenCL 是否支持向量作为内核参数?
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- "configure"脚本如何检测我的系统是否支持某些头文件或 cpp 功能?
- 确定C++应用程序是否作为具有旧版支持的 UWP 应用运行
- 基于 SFINAE 的特征,用于确定是否支持运算符 +
- CLion 是否支持自定义输入?如果是,我在哪里输入它们?
- 标准库中的任何正则表达式语法是否支持 (?(定义)用于子模式参考?
- GCP 或 AWS 是否支持 C++ 和 GUI 应用程序开发?
- Visual Studio 2019 v16.3.9 是否完全支持 C++20?
- Go 是否支持调用C++函数?
- libtorrent是否支持带摘要身份验证的http web种子
- 张量流 c++ API 是否支持反向传播的自动微分?
- boost odeint 中的受控误差步进器是否支持复杂的数据类型?
- g++ 是否支持scalar_storage_order?
- 罗斯林是否支持C++生成语法树
- libstdc++ 对 std::unordered_map 的支持是否不完整