将几行代码写入一行是否有益(在内存和空间复杂性方面).这值得么?

Jat*_*gal 1 c c++ java

示例:交换两个nos的简单程序.

 int a = 10;
 int b = 20;
 a = a+b;
 b = a-b;
 a = a-b;
Run Code Online (Sandbox Code Playgroud)

现在在下面的代码中:

 a=a+b-(b=a);
Run Code Online (Sandbox Code Playgroud)

我的意思是这两个代码有什么区别?

另外:如果这两个的加法超过了整数的合法限制,这在Java和C++的情况下有什么不同呢?

Jon*_*eet 5

这些都不适合我.可读性是关键.如果要交换值,最明显的方法是通过临时值:

int a = 10;
int b = 20;

int tmp = a;
a = b;
b = tmp;
Run Code Online (Sandbox Code Playgroud)

我既不知道也不会关心这是否与涉及算术的"聪明"方法一样有效.在有人证明在实际应用程序中性能差异很大之前,我的目标是使用最简单的代码.不只是在这里,而是所有代码.确定您需要执行的程度(以及在什么维度上),测试它,并将其更改为更复杂但有效的(如果需要).

(当然,如果您的平台上有swap可用的操作,请使用它...更清楚.)

  • @JatinSehgal如果编程取决于临时的4个字节(无论如何可能会被优化掉,可能移到寄存器中),你可能需要重新考虑它. (3认同)

Luc*_*ore 5

在C++中,代码产生未定义的行为,因为没有序列点a+b-(b=a),你正在改变b它并从中读取.

你最好使用std::swap(a,b)它,它是针对速度进行优化的,比你拥有的更具可读性.


fkl*_*fkl 5

由于您的特定代码已经被评论过,我只想添加一个方面.编写一个衬垫并不重要,因为在指令级别,您无法避免将程序集转换为机器代码的步骤数.大多数编译器已经相应地进行了优化.

也就是说,除非一个内联实际上使用不同的机制来实现目标,例如在交换两个变量的情况下,如果你不使用第三个变量并且可以避免所有障碍,例如类型溢出等,并使用按位运算符例如,那么您可能已经保存了一个内存位置,从而可以访问它.

在实践中,这几乎没有价值,并且在可读性方面存在问题,如其他答案中已经提到的那样.专业课程需要由人们维护,以便他们易于理解.

良好代码的一个定义是Code实际上做了它似乎正在做的事情

即使你自己会发现很难修复你自己的代码,如果它是根据一些缩短但复杂的操作巧妙地编写的.应始终优先考虑可读性,并且大多数时候,真正需要的效率来自改进设计,方法或更好的数据结构/算法,而不是简短的一个衬里.

引用Dijkstra:有能力的程序员完全了解自己头骨的有限尺寸.因此,他完全谦卑地接近他的任务,并避免像瘟疫一样聪明的伎俩.