[SOS]C++ 函数诡异的返回问题

v2nero 2012-11-07 10:44:50
如下函数:
std::string Func()
{
return "LZ C++ 也是菜鸟一只\n";
}

或者这个:
std::string Func()
{
std::string str = "LZ C++ 也是菜鸟一只\n";
return str;
}
按我现在C语言菜鸟的水平实在无法理解,求大神们帮我解释下我这只C++菜鸟是怎么 return 回去的?
实在是不能理解啊
...全文
153 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
v2nero 2012-11-08
  • 打赏
  • 举报
回复
刚才我已经google上搜到我这个帖子了 Keyword="without optimization, the returned values are created using the copy constructor" 百度蛋都没下个。。 垃圾就是垃圾。。
v2nero 2012-11-08
  • 打赏
  • 举报
回复
分好像给得有点不太合理。。 不过不多。各位大神应该不会介意吧。。
v2nero 2012-11-08
  • 打赏
  • 举报
回复
谢谢各位大神的回复。 但为一个C菜,我认为这种操作是不合法。 传说早期C++也是不支持的,<-- http://en.wikipedia.org/wiki/Return_value_optimization#cite_note-gcc-8 现在C++成了理所当然。。 巨汗中。。看来这种非正规途径专C++也是非法的。。
mujiok2003 2012-11-07
  • 打赏
  • 举报
回复
without optimization, the returned values are created using the copy constructor
  • 打赏
  • 举报
回复
std::string Func()
{
    return "LZ C++ 也是菜鸟一只\n";
}
 
int main( int argc, char *argv[])
{
    std::string s = Func();
    printf("%s\n",s.c_str());
    return 0;
}
编译器大概会这么实现,不完全等价上面的代码。
void Func(std::string* x)
{
	new(x) std::string("LZ C++ 也是菜鸟一只\n");
}

int main( int argc, char *argv[])
{
	char x[sizeof(std::string)];
	Func( (std::string*)&x );
	printf("%s\n",((std::string*)&x)->c_str());
	((std::string*)&x)->~string();
	return 0;
}
wudaijun 2012-11-07
  • 打赏
  • 举报
回复
就是构造一个临时string对象额。没什么好解释的。楼主试试下面的代码:
#include <iostream> using namespace std; class A { public: A(int i) { cout<<"Constructor A"<<endl; data = i; } private: int data; }; A test() { return 1; } int main() { test(); return 0; } 运行结果: Constructor A 这样应该理解了吧?
  • 打赏
  • 举报
回复
反汇编一下不都有了么 某些时候,会将返回值作为参数传递过去。 比如你写的这个代码。
std::string Func()
{
    return "LZ C++ 也是菜鸟一只\n";
}

int main( int argc, char *argv[])
{
	std::string s = Func();
	printf("%s\n",s.c_str());
	return 0;
}
汇编代码如下
_TEXT	SEGMENT
___$ReturnUdt$ = 8
$T8486 = -4
?Func@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ PROC NEAR ; Func
; File test.cpp
; Line 5
	push	ebp
	mov	ebp, esp
	push	ecx
; Line 6
	lea	eax, DWORD PTR $T8486[ebp]
	push	eax
	push	OFFSET FLAT:$SG7412
	mov	ecx, DWORD PTR ___$ReturnUdt$[ebp]
	call	??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDABV?$allocator@D@1@@Z ; std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >
	mov	eax, DWORD PTR ___$ReturnUdt$[ebp]
; Line 7
	mov	esp, ebp
	pop	ebp
	ret	0
?Func@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ ENDP ; Func
_TEXT	ENDS
_TEXT	SEGMENT
_s$ = -16
$T8488 = -20
_main	PROC NEAR
; Line 10
	push	ebp
	mov	ebp, esp
	sub	esp, 20					; 00000014H
; Line 11
	lea	eax, DWORD PTR _s$[ebp]
	push	eax
	call	?Func@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ ; Func
	add	esp, 4
; Line 12
	lea	ecx, DWORD PTR _s$[ebp]
	call	?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ ; std::basic_string<char,std::char_traits<char>,std::allocator<char> >::c_str
	push	eax
	push	OFFSET FLAT:$SG7419
	call	_printf
	add	esp, 8
; Line 13
	mov	DWORD PTR $T8488[ebp], 0
	lea	ecx, DWORD PTR _s$[ebp]
	call	??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ ; std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >
	mov	eax, DWORD PTR $T8488[ebp]
; Line 14
	mov	esp, ebp
	pop	ebp
	ret	0
_main	ENDP
_TEXT	ENDS
v2nero 2012-11-07
  • 打赏
  • 举报
回复
引用 1 楼 JiMoKuangXiangQu 的回复:
C/C++ code123456789101112131415161718192021std::string Func(){ // 构造一个临时字符串对象作为返回值 // 如果不理解,请看下面的一个对比代码,是一样的道理 return "LZ C++ 也是菜鸟一只\n";} // 和上面同样的道理int f(){ return (5 + 6 + 7……

第一个函数:
    能向我讲讲实际流程吗?
第二个函数:
    mov ax,18;就完事了.
第三个函数:
    同一,求详细解释

JiMoKuangXiangQu 2012-11-07
  • 打赏
  • 举报
回复
std::string Func()
{
    // 构造一个临时字符串对象作为返回值
    // 如果不理解,请看下面的一个对比代码,是一样的道理
    return "LZ C++ 也是菜鸟一只\n";
}

// 和上面同样的道理
int f()
{
    return (5 + 6 + 7);
}


std::string Func()
{
    // 和最上面的函数同样的道理,只是显式的用str变量命名了
     // 不像上面返回一个匿名的对象
    std::string str = "LZ C++ 也是菜鸟一只\n";
    return str;
}

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧