65,208
社区成员
发帖
与我相关
我的任务
分享
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;
}
#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
第一个函数:
能向我讲讲实际流程吗?
第二个函数:
mov ax,18;就完事了.
第三个函数:
同一,求详细解释
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;
}