免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: liwangli1983
打印 上一主题 下一主题

关于c++函数返回类的复制构造问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-10-18 15:09 |只看该作者
不提这个右值了,这个该死的C++,0x 0x的,到现在也没X完,估计要还在1X,2X,3X
开了一个错误的头,弄一堆BUG,标准委员会天天就是在debug和制造更多的BUG。


以前我想写一个网库库,里面有多线程,多进程,内存池,各种多路复用模式的,用C++写,发现绝大多数时间和绝大多数代码,不是为了实现什么功能,而是为了这一堆构造函数浪费了。

C++在某些方面,就是虐待开发者,先不谈这个足可以跨世纪的编译时间就说说下面的:
哪个C++库做到了KISS?  是ACE还是boost?为啥QT定可用char*来传signal/slots而不用函数指针?为啥gtk+的c++绑定gtkmm没几个人用?我觉得这都是C++的一堆恶心问题造成的。
pygtk实现gtk+绑定,用脚本+配置文件就可以实现了。
而gtkmm呢? 一大堆手工代码,哪天有人想扩展一下,那不是在寻死?

论坛徽章:
0
12 [报告]
发表于 2010-10-18 15:25 |只看该作者
C++是一门复杂的语言,而且编译器动作做的太多了。

论坛徽章:
0
13 [报告]
发表于 2010-10-18 15:30 |只看该作者
gtkmm大量的代码也是自动生成的,基本上可以认为就是一个c++绑定,我认为除了重了一些(gtk本身也不轻),基本没什么问题。相反我更希望gtk一开始就是基于c++设计的。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
14 [报告]
发表于 2010-10-18 15:47 |只看该作者
回复 11# gtkmm

"运行效率与抽象兼顾", 相比"优先考虑开发效率" 那肯定是要付出一些代价的。
不能因为你不理解, 或者它不适合你的问题, 就说它是bug吧?

Qt的做法, char* 当然可以啊。
但需要注意:
函数名、 参数错误是在运行时而不是编译时得到检查。
函数名决议到地址, 也是运行时。
……

这其实是在静态类型语言中弄出一个动态类型的环境。
所以被固执的gtkmm批评说不是C++风格也是情有可原的。

在这个问题上, 我倒觉得不一定非要遵守静态类型。

总之, C++有能力在极端需要效率的时候能够使用; 也能够在不太需要效率时作出一些让步。
而一些一开始就在效率上作出让步的, 就没办法追回了。

论坛徽章:
0
15 [报告]
发表于 2010-10-18 19:55 |只看该作者
回复  liwangli1983

问题出在构造上。

X x; // 不抛出
X x = X(); // 抛出

双return是使编译器改 ...
OwnWaterloo 发表于 2010-10-18 14:53



    就是多用X x或X x(p)(假设p也是X类的对象),少用X x = X(p)这类吧?C++才开始看,还有很多不明白的。。。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
16 [报告]
发表于 2010-10-19 09:41 |只看该作者
只有唯一返回值时,GCC才优化掉复制构造函数。
而VC则始终不优化。


我说这个例子只是想证明C++不是一 ...
gtkmm 发表于 2010-10-17 14:33


你是想C++的class强制在堆上面分配?而且还要将其内存释放动作交给托管代码吗?我不知道你为什么会有这种想法,如果真这么做的话,会有两个问题,一是频繁多次使用class大大影响程序速度,二是无法知道对象的确切析构时机。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
17 [报告]
发表于 2010-10-19 12:49 |只看该作者
回复 15# liwangli1983

表达的意思依然是: 程序应该对这种复制构造被省略的行为不敏感。
一个 x, 无论是通过 X x = X(p) 得到, 还是通过 X x(p) (优化掉了一个复制)得到, 都应该是正确的。
X x = X(p) 和 X x(p) 是一个比喻。

论坛徽章:
0
18 [报告]
发表于 2010-10-19 14:13 |只看该作者
我的意思是在堆上。   

class T{...}

T t = new T(...);
这里,t是一个智能指针。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
19 [报告]
发表于 2010-10-19 14:44 |只看该作者
我的意思是在堆上。   

class T{...}

T t = new T(...);
这里,t是一个智能指针。
gtkmm 发表于 2010-10-19 14:13



    强制class分配在堆上面有什么好处?

论坛徽章:
0
20 [报告]
发表于 2010-10-19 14:47 |只看该作者
创建了一种新的类型,新的方式。
让原来的class,struct合并成struct这个关键字上。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP