在C++中,A+=B 是否优于 A=A+B,就像 ++A 优于 A++ 一样
In C++, is A+=B preferable to A=A+B in the same way ++A is to A++?
在C++中,A+=B是否比A=A+B更可取,就像++A比A++更好吗?
我知道"++A"预增量保证至少与"A++"后增量一样快。这在很多地方都有讨论,包括这里和这里。同样,A+=B 预计至少与 A=A+B 一样快,就像这里一样。
我正在为 ++ 查看这个:
//From https://herbsutter.com/2013/05/13/gotw-2-solution-temporary-objects/
T T::operator++(int)() {
auto old = *this; // remember our original value
++*this; // always implement postincr in terms of preincr
return old; // return our original value
}
我的推理是,在最坏的情况下(可能来自复杂的对象类型),A=A+B 必须检索和存储 A 并添加 B,然后再将其保存回原始 A 位置,而 A+=B 将采用 B 并将其直接添加到 A。我的推理正确吗?
预计基本类型在编译时被重新排列为相同,这实际上仅适用于需要运算符重载的复杂对象。
这是否普遍适用于大多数命令式语言?
说原因并不完全相同。 我更喜欢A += B
而不是A = A + B
的主要原因是简洁。 A += B
明确指出您要将 B 添加到 A。 如果A
是一个更复杂的表达式,则尤其如此:
node_capacities[std::make_pair(node1,node2)] += edge.capacity;
我也从未发现A += B
的表现比A = A + B
差。
要记住的一件大事是C++有运算符重载,这意味着运算符+=
可能意味着与你期望完全不同的东西。
仅当"目标"类没有为其定义+=
运算符时,+=
运算符才用作添加和赋值。运算符重载还意味着,例如x++
可能意味着不同的事情,具体取决于x
的类实例为运算符重载定义的内容。
你应该更喜欢A += B;
。
如果你曾经写过一个A = A + B;
比A += B;
更好的类型,那么你应该改变operator+=
的实现,以完全按照A = A + B;
的作用去做。
但是,通常不能反之道而行之;您通常无法以任何合理的方式修改operator+
以使A = A + B;
执行与A += B;
完全相同的事情。
因此,如果A += B;
和A = A + B;
之间存在差异,您应该期望A += B;
是更好的选择。
在大多数情况下,A+=B 更可取。正如您所指出的,A = A + B 与 A+=B 中会有更多的寄存器负载。另外,阅读SSA可能也很有趣。这用于编译器优化,可能有助于了解如何处理这种情况。正如你所说,由于编译器,大多数这些考虑都从程序员手中拿走了,但了解这些事情是件好事。
在复杂对象中要考虑的另一个考虑因素是调用 getter 可能引起的副作用,以及调用此类 getter 两次的后果。(想想,A.get() = A.get() + B.get())。然而,这应该是相对罕见的,因为在大多数情况下,吸气剂不应该有副作用。
事实上,在C++中,你应该避免使用后缀运算符:
- ++a//这里运算符 ++ 以前缀
- a++//这里运算符 ++ 是后缀
仅仅因为后缀解决方案将使用 a 的值,然后增加其值,这有时可能是危险的,或者至少会降低某些性能。
您可以在此处查看更多信息。
- 我们可以将集合的值存储在变量中吗?就像我们可以将数组的值存储在变量中一样
- 如何使用 redis-plus-plus 存储二进制数据,就像我想存储结构一样?@for_stack?
- 如何将到达图形视图右侧(末端)的QGraphicsPixmapItem移动到左侧(开始)侧(就像在贪吃蛇游戏中发生的事情
- 为什么C++中没有常量引用,就像常量指针一样?
- 我必须找到给定数组中所有数字的周期,就像有很多解决方案,但数组的大小是 10^5
- 如何将输入值拆分为4位矢量,就像将n位拆分为每部分矢量的半字节一样
- 为什么向量不支持 size 作为成员变量,就像 Java 类中的长度变量一样,而是函数 size()?
- C++代码生成核心文件,就像 gdb >> gcore 一样
- 从 boost::variant 中逐个索引获取项目,就像使用 std::variant 一样
- 线程 1 从文件读取,就像线程 2 写入同一文件一样
- 如何将值插入到 c++ boost::multiindex 集合的特定索引中,就像在 std::list 中一样
- 如何在Powershell中运行C++程序,就像CMD一样?
- 将参数传递给成员函数,就像使用 std::cout 一样
- 我想知道如何将所有数值与没有任何空格的字符串分开,就像 123we45rt75 一样
- 如何获得CPU当前速度,就像Taskmgr中的价值外交一样?下图
- C - 将数字添加到列表中?(就像python)
- 在C 中,对Pair类STL的用途是什么,就像数据类型或容器一样
- 如何在文件系统之上添加层?就像OneDrive或Google云端硬盘中的缓存一样
- 为什么 gRPC C++ 客户端在没有显式服务器的 SSL 证书的情况下无法工作,就像在示例中一样?
- 可变参数函数并复制粘贴这些参数(就像我们在宏中一样)