而这么多运算符重载里, 最最最豪华有用便利神器的,就是 () 运算符重载了.
() 运算符重载,就能将一个对象作为一个函数, 以实现闭包.
闭包是非常有用的功能, C 语言因为不支持闭包, 必须搞个邪恶的 void* 作为回调参数之一. 而不懂得使用闭包
的人, 也会使用"单根继承" 这种恶心的策略. ( hei ,我说的是 你 ! MFC 和 Qt .) 通过基类指针来代替 void*
闭包可不简简单单的用来做 for_each 的参数, 更重要的是用来实现协程.
用闭包实现的协程, 无需一个例程用于上下文切换 (swap_context(3) 和 Win32 里的 Fiber)
所有的状态都保存在了成员变量里.
hi, 砖头出了, 欢迎玉
--
---
您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
> 个人觉得,运算符重载带来的混乱(你永远不能一眼看出c = a + b是什么意思)远远多于它带来的好处。
>
任何语言特性滥用都是带来混乱的. 你这么认为只能说明你看到的代码滥用居多吧.
> 2013/4/30 机械唯物主义 : linjunhalida <linjun...@gmail.com[1]>
> 有没有示例代码展示?不是很懂。
>
> 2013/4/30 HaoPeiQiang <HaoPe...@gmail.com[2]>
> 这属于唯恐天下不乱么?
>
> 我对C++不是很懂,欢迎大家拍砖
>
> 2013/4/30 microcai <micro...@gmail.com[3]>
> 话说 C++ 语言里的一个伟大的决策就是能进行运算符重载.
而这么多运算符重载里, 最最最豪华有用便利神器的,就是 () 运算符重载了.
() 运算符重载,就能将一个对象作为一个函数, 以实现闭包.
闭包是非常有用的功能, C 语言因为不支持闭包, 必须搞个邪恶的 void* 作为回调参数之一. 而不懂得使用闭包
的人, 也会使用"单根继承" 这种恶心的策略. ( hei ,我说的是 你 ! MFC 和 Qt .) 通过基类指针来代替 void*
闭包可不简简单单的用来做 for_each 的参数, 更重要的是用来实现协程.
用闭包实现的协程, 无需一个例程用于上下文切换 (swap_context(3) 和 Win32 里的 Fiber)
所有的状态都保存在了成员变量里.
hi, 砖头出了, 欢迎玉
pongba+un...@googlegroups.com[4]。要查看更多选项,请访问
https://groups.google.com/groups/opt_out[5]。
>
>
> --
>
> http://magazine-maker.com[6]
>
> -- --- 您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。要退订此论坛并停止接收此论
坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com[4]。要查看更多选项,请访问
https://groups.google.com/groups/opt_out。[7]
>
>
> --
> GuruDigger- We help internet products find technical partners who share the
same dream!
> -- --- 您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。要退订此论坛并停止接收此论
坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com[4]。要查看更多选项,请访问
https://groups.google.com/groups/opt_out。[7]
>
> -- --- 您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。要退订此论坛并停止接收此论
坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com。要查看更多选项,请访问
_https://groups.google.com/groups/opt_out。_
>
--------
[1] mailto:linjun...@gmail.com
[2] mailto:HaoPe...@gmail.com
[3] mailto:micro...@gmail.com
[4] mailto:pongba%2Bunsu...@googlegroups.com
[5] https://groups.google.com/groups/opt_out
[6] http://magazine-maker.com/
[7] https://groups.google.com/groups/opt_out。
[8] http://gurudigger.com
--
---
您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
在 2013年4月30日 星期二 05:05:44,猛禽 写道:
至少在模板参数可以使用函数对象之前,()重载的用处我觉得还是比较有限的。
很多年不用C++,不知道现在已经可以了,大概会比以前有用一些吧。
其实运算符重载用得恰当的确是个神器,但太容易被滥用了…
啥, "不知道现在已经可以了" ?????? 莫非大神是在 80 年代用过的 C++ ????????????
--
没错, C++ 是一个强调语义一致性的语言. 和 java python 这种不入流的垃圾不可同日而语.
>
> 不过对我来说,还是”改造语言“的快感是主要的。哇哈哈哈哈
> (不要讨论误入歧途神马的,谢谢)
>
>
> 当然,()运算符因为有”调用“的语义所以引申出来的层面更广。不过没有lambda时函数对象这个用起来真心
累,有了lambda之后也主要是做快速创建临时的小型可调用对象的语法糖(再次说,我大爱语法糖)。用
做”闭包“,我特别是指携带着不属于lambda自身的局部变量在函数之间传来传去的那种”函数式“编程风格,在
C++中还没成气候吧,另外,我对这种搞法的”可读性“也表示怀疑。
>
lambda 就是函数对象的语法糖. 但是如果是大片的代码, 还是老实写 operator() . lambda 只适合非常短的地
方, 一两行就能解决的那种.
>
> 另,歪下楼,C++发展到今天,有这么许多超出C之外特异的语法,我觉得特别缺一个好的”代码阅读器“(像
Source Insight对于C那样),有一个好的代码阅读器的话,可以很大程度地降低C++代码阅读的心智负担并提
高可维护性。
>
>
>
>
>
>
>
>
> 在 2013年5月1日上午9:21,microcai <micro...@gmail.com[1]>写道:
>
>
> 在 2013年4月30日 星期二 05:05:44,猛禽 写道:
>
>
> 至少在模板参数可以使用函数对象之前,()重载的用处我觉得还是比较有限的。
> 很多年不用C++,不知道现在已经可以了,大概会比以前有用一些吧。
> 其实运算符重载用得恰当的确是个神器,但太容易被滥用了…
>
>
>
> 啥, "不知道现在已经可以了" ?????? 莫非大神是在 80 年代用过的 C++ ????????????
> -- --- 您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。要退订此论坛并停止接收此论
坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com[2]。要查看更多选项,请访问
https://groups.google.com/groups/opt_out。[3]
>
>
>
> -- --- 您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。要退订此论坛并停止接收此论
坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com。要查看更多选项,请访问
_https://groups.google.com/groups/opt_out。_
>
>
>
>
> --------
> [1] mailto:micro...@gmail.com
> [2] mailto:pongba%2Bunsu...@googlegroups.com
> [3] https://groups.google.com/groups/opt_out。
>
> [2] mailto:pongba%2Bu...@googlegroups.com
> [3] https://groups.google.com/groups/opt_out。
>
python 里充满了这种"做作" 的强制. 以表明设计者是个 "很重视优雅" 的人.
其实说白了 python 是个门外汉设计给门外汉的语言.
>
>
>
>
--
---
您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
我已经说了,lambda表达式不等于匿名函数,所以这根本谈不上"做作"的强制。
至于C++为了实现这些而用了那些迂回的办法,又何尝不是为了"语法一致性"不得已而为呢?
另,同意老许意见。
> --
>
> ---
> 您收到此邮件是因为您订阅了 Google 网上论坛“TopLanguage”中的主题。
> 要退订此主题,请访问 https://groups.google.com/d/topic/pongba/gBpPkoXvdeY/unsubscribe?hl=zh-CN。
> 要退订此论坛及其所有主题,请发送电子邮件到 pongba+un...@googlegroups.com。
> 要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
>
>
事实就是这样, python 靠所谓的 "简单" 吸引大量的开发者. 可是 python 事实上是不够资格作为一门编程语言
的.
python 只能是脚本. 而脚本语言有比 python 优秀百倍的 javascript .
我给出了详细的 python 为啥很烂的解释
https://avlog.avplayer.org/3597082/python%E6%98%AF%E4%B8%AA%E7%83%82%E8%AF%AD%E8%A8%80.html
我可不是那种简单的给打个标签 缺乏根据在那里胡扯 的那种人.
谁要是不同意可以逐条反驳.
--
---
您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
黑猫白猫能抓到老鼠就是好猫。
MFC 有一个公有的基类 CObject , Qt 也有一个公共基类 QObject .
> 就本人有限的经验而言MFC和Qt的单根继承也不是要解决你说的问题啊?!
> 你举的栗子不是很恰当吧?用不着打击MFC和Qt显示你很NB啊?
打击他不是为了显示我很 NB , 只是单纯的觉得就应该打击一下. 你想多了.
> 改造语言特性的做法,我觉得到了一定程度也是很常见的,无论是C++还是Python,只要你觉得自己能够处
理好。
>
--
---
您收到此邮件是因为您订阅了 Google 网上论坛“TopLanguage”中的主题。
要退订此主题,请访问 https://groups.google.com/d/topic/pongba/gBpPkoXvdeY/unsubscribe?hl=zh-CN。
要退订此论坛及其所有主题,请发送电子邮件到 pongba+un...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
话说 C++ 语言里的一个伟大的决策就是能进行运算符重载.
而这么多运算符重载里, 最最最豪华有用便利神器的,就是 () 运算符重载了.
() 运算符重载,就能将一个对象作为一个函数, 以实现闭包.
闭包是非常有用的功能, C 语言因为不支持闭包, 必须搞个邪恶的 void* 作为回调参数之一. 而不懂得使用闭包
的人, 也会使用"单根继承" 这种恶心的策略. ( hei ,我说的是 你 ! MFC 和 Qt .) 通过基类指针来代替 void*
闭包可不简简单单的用来做 for_each 的参数, 更重要的是用来实现协程.
用闭包实现的协程, 无需一个例程用于上下文切换 (swap_context(3) 和 Win32 里的 Fiber)
所有的状态都保存在了成员变量里.
hi, 砖头出了, 欢迎玉
> C++搞闭包是天生残疾,因为没有GC特性,所以闭包的生存周期管理就是个问题,手工delete会让人抓狂,所
以要么当值拷贝来拷贝去的浪费性能,要么用引用计数传来传去的,还是浪费性能。
>
c++11 有 Move 语义
不是只有脚本语言才支持闭包的,其他静态类型的语言也有很多支持闭包的(除了比较落伍的java)。如果把C++函数一个个孤立起来看,确实可以做到极致的高性能,但是如果放到整个系统层面,C++的复杂性往往会带来很多意想不到的坑,比如说频繁的创建删除对象,造成内存碎片,还有各种内存泄漏等等。在我的职业生涯中,曾经有过一次用C++写的游戏,在变态的24小时连续压力测试中,因为内存碎片以及一个第三方库中的一个很小的内存泄漏,导致内存无法分配而程序crash,最后换了内存分配器,打了patch才通过测试。另外,所谓GC造成的内存占用,在我实践中是没有出现过什么大问题的,我写的服务器运行几个月内存占用都很平稳,真的有问题,也很容易通过profiling工具定位。在 2013年5月2日上午12:59,Yongwei Wu <wuyo...@gmail.com>写道:
还没仔细看实现,粗想一下,闭包的数据量实际上主要也就是由捕获的数据量决定。一般情况下并没什么问题。况且,脚本语言有GC性能也没法跟C++比。GC带来的缺点也是很显然的,特别是内存占用。2013/5/2 qiaojie <qia...@gmail.com>
C++搞闭包是天生残疾,因为没有GC特性,所以闭包的生存周期管理就是个问题,手工delete会让人抓狂,所以要么当值拷贝来拷贝去的浪费性能,要么用引用计数传来传去的,还是浪费性能。
--
GC的问题在服务器上我觉得不明显。在客户端、特别是移动设备上较明显。iPhone完全是不用GC的,设备对内存的需求明显比Android的低。
GC的问题我曾经与云风有过争论,我原来的观点跟你差不多,但最终他说服了我。我接受GC的理由主要有几个:首先一点,内存已经足够便宜,为了省一点点内存而去做优化,所花的代价远高于买内存的成本,除非的确是对内存使用有苛刻要求的应用,否则GC之类的已经足够好。其次,自定义内存管理存在的BUG风险远大于现成的GC实现。第三,除非对每个特定应用定制内存管理方案,否则未必能比技术成熟的GC好到哪里去。
--
---
您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。
--
---
您收到此邮件是因为您订阅了 Google 网上论坛“TopLanguage”中的主题。
要退订此主题,请访问 https://groups.google.com/d/topic/pongba/gBpPkoXvdeY/unsubscribe?hl=zh-CN。
要退订此论坛及其所有主题,请发送电子邮件到 pongba+un...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
但事实就是如此,你也说了现在的软件根本不介意越来越多地占用内存——因为对这些软件开发者来说,有太多事情比省内存要重要得多。我猜测这也与历史经验有关……当年Lotus 1-2-3为了在新版本里节省内存,又增加功能,最后导致发布日期不断推迟,最终产品还BUG巨多。相比之下,微软的Excel以多占内存,但随着硬件技术的进步而战领市场。节约内存的成本太高了……至于说C++增加GC,也并不是不可能,比如Managed C++……据Milo老师实测,比起原生的C++,性能下降非常有限。还有像闭包这种东西,十几年前Borland就在C++Builder里搞了一个私有的实现。至于移动应用开发里用C++,倒也不完全是为了内存,更多的是为了性能——至少在android平台下,java虚拟机的性能终归还是没法跟C++的原生代码相比。
这属于唯恐天下不乱么?我对C++不是很懂,欢迎大家拍砖
话说 C++ 语言里的一个伟大的决策就是能进行运算符重载.
而这么多运算符重载里, 最最最豪华有用便利神器的,就是 () 运算符重载了.
() 运算符重载,就能将一个对象作为一个函数, 以实现闭包.
闭包是非常有用的功能, C 语言因为不支持闭包, 必须搞个邪恶的 void* 作为回调参数之一. 而不懂得使用闭包
的人, 也会使用"单根继承" 这种恶心的策略. ( hei ,我说的是 你 ! MFC 和 Qt .) 通过基类指针来代替 void*
闭包可不简简单单的用来做 for_each 的参数, 更重要的是用来实现协程.
用闭包实现的协程, 无需一个例程用于上下文切换 (swap_context(3) 和 Win32 里的 Fiber)
所有的状态都保存在了成员变量里.
hi, 砖头出了, 欢迎玉
--
---
您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
> 在 2013年5月1日 星期三 18:41:22,shiwei xu 写道:
>事实就是这样, python 靠所谓的 "简单" 吸引大量的开发者. 可是 python 事实上是不够资格作为一门编程语言
>
> 反感这种给其他语言打标签的人。
> 虽然你喜欢c++,但也没必要通过贬低其他语言的创始人来抬高c++。
> 如果你像我一样,用c++做了10多年的程序,带团队做了多个项目,你就知道c++对程序员的素质要求有多
高,你就知道什么语法优雅的一致性都是浮云。
>
的.
python 只能是脚本. 而脚本语言有比 python 优秀百倍的 javascript .
我给出了详细的 python 为啥很烂的解释
https://avlog.avplayer.org/3597082/python%E6%98%AF%E4%B8%AA%E7%83%82%E8%AF%AD%E8%A8%80.html
我可不是那种简单的给打个标签 缺乏根据在那里胡扯 的那种人.
谁要是不同意可以逐条反驳.
On Wednesday, May 1, 2013 9:55:11 AM UTC+8, 唐风 wrote:
> 重载运算符(包括不限于())能让程序员做出来的东西长得像语言内建操作一样,让人有”改造语言“的快感,这个很上瘾。(特别是对于我,如此地上瘾以至于因为Scala在这一点上更加激进而转头学Scala)。
> 装理性地说,
> 1. 重载运算符让程序有机会更加易懂(因为运算符是入门必学,比如上面Matrix的例子),
> 2. 也让我们创建的类型和语言内置类型能在语法表现上保持一致(满足了一致性和简洁性的审美,心里爽~~),从而使得模板写起来通用性更强。
>
>
>
> 不过对我来说,还是”改造语言“的快感是主要的。哇哈哈哈哈
> (不要讨论误入歧途神马的,谢谢)
>
>
> 当然,()运算符因为有”调用“的语义所以引申出来的层面更广。不过没有lambda时函数对象这个用起来真心累,有了lambda之后也主要是做快速创建临时的小型可调用对象的语法糖(再次说,我大爱语法糖)。用做”闭包“,我特别是指携带着不属于lambda自身的局部变量在函数之间传来传去的那种”函数式“编程风格,在C++中还没成气候吧,另外,我对这种搞法的”可读性“也表示怀疑。
>
>
>
> 另,歪下楼,C++发展到今天,有这么许多超出C之外特异的语法,我觉得特别缺一个好的”代码阅读器“(像Source Insight对于C那样),有一个好的代码阅读器的话,可以很大程度地降低C++代码阅读的心智负担并提高可维护性。
>
>
>
>
>
>
>
>
>
>
> 在 2013年5月1日上午9:21,microcai <micro...@gmail.com>写道:
>
>
>
>
>
> 在 2013年4月30日 星期二 05:05:44,猛禽 写道:
>
>
>
> 至少在模板参数可以使用函数对象之前,()重载的用处我觉得还是比较有限的。
>
> 很多年不用C++,不知道现在已经可以了,大概会比以前有用一些吧。
>
> 其实运算符重载用得恰当的确是个神器,但太容易被滥用了…
>
>
>
>
> 啥, "不知道现在已经可以了" ?????? 莫非大神是在 80 年代用过的 C++ ????????????