1
typing 2013-06-30 17:22:27 +08:00 via iPad
你试试看交换没有
|
2
fly2never 2013-06-30 17:22:49 +08:00 1
注意看函数参数
另外文艺那个才是真2B |
3
zsj950618 2013-06-30 17:23:17 +08:00
the third function can't work!
|
4
alexrezit 2013-06-30 17:29:25 +08:00
普通和文艺哪个更快呢? 我的很多代码都是用类似文艺方法写的, 不知道对速度有木有影响.
|
6
fangzhzh 2013-06-30 17:53:45 +08:00 1
2b程序这样解释, a和b要交换体液,结果各自派了替身,白忙活了,都没有爽到...
|
7
timonwong 2013-06-30 17:55:37 +08:00
|
8
yuanz 2013-06-30 18:06:50 +08:00
第一个 void swap(int &a, int &b) 是什么写法, int &a 这个形式是什么意思?求解释...
|
9
luikore 2013-06-30 18:16:00 +08:00
其实文艺程序员那个不仅有 bug, 还可能会慢一点
因为变量仅仅是名字而已, 很多 swap 代码可以被编译器优化成没 swap 的 clang++ -O3 -c -S 看看汇编的差别就知道了 |
10
luikore 2013-06-30 18:18:51 +08:00
如果某个奇技淫巧真的有优化作用, 就已经写进编译器里了, 不要自己白忙活啦...
|
11
msg7086 2013-06-30 18:44:20 +08:00 1
|
16
msg7086 2013-06-30 18:50:55 +08:00
|
19
davepkxxx 2013-06-30 19:26:08 +08:00
void swap(int a, int b) 这种写法是指针传递。
指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。 void swap(int &a, int &b) 这种写法是引用传递。 在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。 想要了解跟多请参考C++的指针和引用传递相关内容。 |
20
davepkxxx 2013-06-30 19:27:21 +08:00
第二种写法是什么意思?没看懂。
|
22
jjplay 2013-06-30 19:49:21 +08:00
给你贴个我之前公司的程序员弄得js代码
$(document).ready(function() { $("#example1-1").imgbox(); }); $(document).ready(function() { $("#example1-2").imgbox(); }); $(document).ready(function() { $("#example1-3").imgbox(); }); $(document).ready(function() { $("#example1-4").imgbox(); }); $(document).ready(function() { $("#example1-5").imgbox(); }); $(document).ready(function() { $("#example1-6").imgbox(); }); )}; ---------------------------------------------- 为毛他就是想不到 for循环 |
24
txx 2013-06-30 20:00:56 +08:00
文艺程序员这个 曾经还有一句话版本的....同样也有bug的....
一般这么写都是用于 acm 大神装逼 而不是用在工程开发上 |
26
treo 2013-06-30 20:28:59 +08:00
swap的标准做法不是xor吗
|
30
luikore 2013-06-30 21:43:51 +08:00
@alexrezit 那对速度也没影响... 编译器基本都有个优化阶段是把代码变成 SSA 形式, SSA 形式所有 var 都只赋值一遍, 或者说就是一大堆 tmp var... 单赋值的代码上面可以做各种优化, 所以 LLVM 的中间语言就是用 SSA 的
http://en.wikipedia.org/wiki/Static_single_assignment_form |
31
celon 2013-06-30 21:52:07 +08:00
使用第二种方法,才是二逼程序员吧?!
我本身参与维护的一个老旧开源项目,里面这种类似写法数不胜数。 |
32
celon 2013-06-30 21:53:03 +08:00 1
补充:
我的意思是:写出不能让人一下子看明白的代码,本身是一种二逼行为。 |
33
luikore 2013-06-30 21:56:04 +08:00 1
@alexrezit
SSA 在分配寄存器阶段才做消除的 如果你脑内分配的结果比寄存器分配算法出来的快, 也可以用 asm ("RIP") 之类的去强制指定变量对应的寄存器, 但是不用内联汇编的话, 就算给变量加 register 关键字, 用不用 temp var 也对结果速度几乎没影响. C++ 里是有复制构造函数的坑, 但是把重量级类型的 temp var 声明成引用类型就没事了. |
34
luikore 2013-06-30 22:09:56 +08:00 2
现代 C 编译器已经打败了上个世纪的各种 2B 优化方式, KISS 的代码往往就是最高效的代码
再举个例子... 如 strcmp 的实现, 网上有大量的陈年博客写是如何强制转换成多字节类型来提速的, 但现在的情况是写成最笨的一个个字节比较的方式反而可能更快. 因为编译器可以做 loop unroll 然后根据 CPU 的 flag 选择 AVX2 / AVX / SIMD2 / SIMD1 指令去搞, 比手工优化来得安全, 而且自动选择了最佳匹配的指令, 速度和跨平台都能兼顾. |
35
Mutoo 2013-06-30 23:18:39 +08:00
哈哈哈哈
|
38
so898 2013-07-01 01:27:20 +08:00
写Objective-C和Java写多了之后,竟然觉得最后一个最顺眼……
我就这样『被2B』了么…… |
39
XDA 2013-07-01 09:39:22 +08:00
void swap(int x, int y)
{ x = x + y; y = x - y; x = x - y; } ———————————————————————————— 这个写法是不是也很2B? |
44
darasion 2013-07-01 12:16:37 +08:00
好复杂,看不懂耶
|
45
XDA 2013-07-01 12:26:28 +08:00
|
48
VeryCB 2013-07-01 13:36:24 +08:00
a, b = b, a
|
49
Hyperion 2013-07-01 19:16:56 +08:00
|
50
atempcode 2013-07-01 19:25:50 +08:00 via Android
2在B前面。
|