2B程序员2在哪里了?

2013-06-30 17:19:42 +08:00
 twor2
5547 次点击
所在节点    程序员
50 条回复
typing
2013-06-30 17:22:27 +08:00
你试试看交换没有
fly2never
2013-06-30 17:22:49 +08:00
注意看函数参数
另外文艺那个才是真2B
zsj950618
2013-06-30 17:23:17 +08:00
the third function can't work!
alexrezit
2013-06-30 17:29:25 +08:00
普通和文艺哪个更快呢? 我的很多代码都是用类似文艺方法写的, 不知道对速度有木有影响.
twor2
2013-06-30 17:40:37 +08:00
@alexrezit 我们俩巨大差异, 一个2b 一个文艺,唉
fangzhzh
2013-06-30 17:53:45 +08:00
2b程序这样解释, a和b要交换体液,结果各自派了替身,白忙活了,都没有爽到...
timonwong
2013-06-30 17:55:37 +08:00
@alexrezit
性能上临时变量稍微快一点点,不过没有显著影响。
另外,xor swap效果与tmp var swap效果不同:如果 a 和 b 引用同一个变量,该变量会被清零。
yuanz
2013-06-30 18:06:50 +08:00
第一个 void swap(int &a, int &b) 是什么写法, int &a 这个形式是什么意思?求解释...
luikore
2013-06-30 18:16:00 +08:00
其实文艺程序员那个不仅有 bug, 还可能会慢一点

因为变量仅仅是名字而已, 很多 swap 代码可以被编译器优化成没 swap 的

clang++ -O3 -c -S 看看汇编的差别就知道了
luikore
2013-06-30 18:18:51 +08:00
如果某个奇技淫巧真的有优化作用, 就已经写进编译器里了, 不要自己白忙活啦...
msg7086
2013-06-30 18:44:20 +08:00
@yuanz C++ 引用

@alexrezit 编译器会用比xor更快的方法实现,比如用XCHG汇编之类的。或者直接在后续的指令中使用新的内存地址引用。
qiukun
2013-06-30 18:44:41 +08:00
@alexrezit 这个文艺方法 bug 在于 0
swulling
2013-06-30 18:48:57 +08:00
@yuanz 取地址运算符,找本c的入门书看看
ls2110609
2013-06-30 18:49:35 +08:00
@fly2never 2在哪?...
swulling
2013-06-30 18:49:50 +08:00
@yuanz 眼花了,这个C++
msg7086
2013-06-30 18:50:55 +08:00
@swulling 关于这个问题我特地去查了一下,明确告诉你,

Address-of Operator: &
Reference Operator: &

这是两个功能不同但是写法相同的运算符
swulling
2013-06-30 18:53:12 +08:00
@msg7086 没看我回复了么。。眼花了,不用普及这个。。。

用取地址也能swap,不过是c写法
msg7086
2013-06-30 18:55:01 +08:00
@swulling 看到了。前面回复的时候被你插楼的。取地址需要传指针嘛,C++简化了这个操作。
davepkxxx
2013-06-30 19:26:08 +08:00
void swap(int a, int b) 这种写法是指针传递。

指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

void swap(int &a, int &b) 这种写法是引用传递。

在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

想要了解跟多请参考C++的指针和引用传递相关内容。
davepkxxx
2013-06-30 19:27:21 +08:00
第二种写法是什么意思?没看懂。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/74234

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX