免费注册 查看新帖 |

Chinaunix

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

[C] 请教:C语言函数的返回值类型能否为结构体? [复制链接]

论坛徽章:
0
51 [报告]
发表于 2010-01-27 13:09 |只看该作者
原帖由 alphayeah 于 2010-1-27 12:58 发表


没什么好讨论的,就是指针的用法。
不过,很讨厌这种直接返回结构体的,很明显,会增加复制操作。
编译的优化就不说了,我只信自己。


是的。
返回大结构是愚蠢行为。

论坛徽章:
0
52 [报告]
发表于 2010-01-27 13:35 |只看该作者
返回结构体指针比较快速。

论坛徽章:
0
53 [报告]
发表于 2010-01-27 14:25 |只看该作者
学习了
一直都是用指针的

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
54 [报告]
发表于 2010-01-27 17:19 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
55 [报告]
发表于 2010-01-27 17:40 |只看该作者
我是LZ。这个问题是在测试一段代码中发现的,developer说C里面不允许返回结构体,说我的case设计的有问题,心里不服气,故上论坛中一探究竟。
首先感谢大家的认真分析,热情回贴。总结了一下:

原帖由 思一克 于 2010-1-27 09:01 发表
结构很小的时候不是真实情况。可以优化为通过寄存器了。
大的结构说明问题。

一般是用一个隐指针参数告诉函数站上的临时结构地址。返回结构的函数完成memcpy.
主函数中有额外的结构赋值(不是调用那个), ...

我觉得这个说的和我理解的差不多。谢谢!

论坛徽章:
0
56 [报告]
发表于 2010-01-27 17:43 |只看该作者
学习了,学术就要这样,很喜欢这里的学术氛围

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
57 [报告]
发表于 2010-01-27 18:09 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

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

回复 #45 w_anthony 的帖子

原帖由 w_anthony 于 2010-1-27 09:17 发表
测试了一下,VC7没遵守这规则,不管开不开优化这里都会有Copy Construct,而MinGW不管开不开优化则都没有Copy Construct。

嘿嘿, 换VC8吧~

看这个:
http://msdn.microsoft.com/en-us/library/ms364057(VS.80).aspx

Named Return Value Optimization in Visual C++ 2005

Summary: Shows how the Visual C++ compiler eliminates redundant Copy constructor and Destructor calls in various situations. (12 printed pages)


原帖由 w_anthony 于 2010-1-27 09:17 发表
一般来说可以直接return 构造函数()的理想情况是比较少的


少和多不好定义。 举一些例子吧。  STL里面返回值的函数包括(但不限于):
string的substr是返回值的。
stringstream的 一个str重载。
valarray 的 许多成员。

我随便翻了翻gcc2.9.5(因为我觉得可能对低版本的编译器更需要这些比较恶心的技巧) 和gcc3.4.5所带的stl。
几乎全都使用的"计算式构造函数"。

如果使用C++0x的move语意能够实现, 这些成员就可以依然高效的返回值, 而且不必使用这种比较恶心的技巧。

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

回复 #51 思一克 的帖子

原帖由 思一克 于 2010-1-27 13:09 发表
是的。
返回大结构是愚蠢行为。


能详细解释一下吗? 为什么愚蠢?

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

回复 #57 pmerofc 的帖子

这不奇怪。 返回结构体是C在标准化时加入的特性。 在那之前, 好像确实存在不可以的编译器。
这个特性的加入, 还引起了不少程序员的反感

btw: 能说说你的看法么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP