算法是否可以安全地解析为输入到输出的自赋值
Can an algorithm safely resolve to self assignment of input to output?
我正在开发一个应用程序,其中我定义了多种算法来处理数据数组,通用形式为:
将 [算法 [k]] 应用于 [i] 处的数据并保存在 [o] 处
缩小到我的疑问:
a) 输入和输出可能是同一个对象,就像对图像应用高斯滤波器时一样。
b) 算法可能会解析为无操作,例如将数据数组插值到其他相同大小的数据数组时。
当(a)和(b)同时发生时,算法的以下部分
o[output_position]=process(i[input_position]);
将坚决
o[output_position]=o[output_position];
这安全吗?
一些相当不完善的推理:
我认为是这样,主要是因为(但我对这个假设没有信心)内存到内存的移动解析为内存到寄存器到内存的移动。
它适用于一些简单的测试,但我没有知识对某人说"看看我精心设计的代码"。
我计划使用优化标志进行编译并转到项目的其他部分,所以我担心将来的某个地方事情会变得繁荣起来,并且在调试器上度过了另一天的美好时光来跟踪这种自我分配。
提前谢谢。
这
完全取决于o[output_position]
的类型。如果它正确实现了赋值运算符,那就没问题了。正确实现的赋值运算符始终适用于自赋值。
C++ 中赋值运算符的惯用实现使用复制和交换习惯用法。这意味着正确的自分配,即使没有您在其他实现中经常看到的this != &other
检查。
当使用基本类型(int,float,char)时,你的推理会很好 - 任何赋值都是由memory-register-memory完成的,这足够快。
使用对象时,需要正确实现赋值运算符 (operator=)。这很可能是通过检查(您必须)没有将对象分配给自身来完成的:
Object operator=(const Object& other) {
if (&other == this) { return *this };
// your assignment code here!
}
相关文章:
- 字符的输入/输出操作
- C++ 中文件输入输出中的长长 v/s int
- 要求用户输入C++输出文件名
- 在C++中重载输入/输出运算符
- 从用户获取输入/输出
- 如何选择waveIn/waveOut函数C++使用的输入/输出设备
- C++击球平均值程序使用输入/输出文件打印名称,平均值,最高/最低平均值时遇到麻烦
- 从 2 位输入输出 4 位数字年份
- 标准输入输出操作如何C++完成
- Windows 中应用程序的每秒输入/输出操作数
- 如何初始化可以设置为默认数组并将输入/输出作为数组的类函数?
- 输入/输出和类
- 使用 Octave GNU 访问输入/输出文件
- (C++)分解这个简单的输入/输出代码:
- TensorFlow模型:如何从原始爱好文件中识别输入/输出节点名称
- 干净取消在输入/输出调用中被阻止的 std::线程
- 将线程之间的标准输入/输出重定向
- 输入/输出异或字符串的 C++ 问题
- C++输入/输出错误
- C++输入输出