算法是否可以安全地解析为输入到输出的自赋值

Can an algorithm safely resolve to self assignment of input to output?

本文关键字:输入 输出 赋值 是否 安全 算法      更新时间:2023-10-16

我正在开发一个应用程序,其中我定义了多种算法来处理数据数组,通用形式为:

将 [算法 [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!
}