http://blogs.wankuma.com/naka/archive/2008/04/23/134712.aspx
を書いているときに面白いコードが出てきたので1ネタ書いてみる。
今回試したコードは以下のコード。
Console.Writeしているのは利用していないとリリースモードで消されてしまうから。
string a = "";
string b = string.Empty;
string c = "";
string d = string.Empty;
Console.Write(a);
Console.Write(b);
Console.Write(c);
Console.Write(d);
これのx64でのアセンブリは以下の通り
static void Main(string[] args)
{
string a = "";
00000000 push rbx
00000001 push rdi
00000002 sub rsp,28h
00000006 mov rdi,129A5060h
00000010 mov rdi,qword ptr [rdi] <=rdiに""を入れている。
string b = string.Empty;
00000013 mov rbx,129A1050h <=rbxにstring.Emptyを入れている。
0000001d mov rbx,qword ptr [rbx]
Console.Write(a);
00000020 mov rcx,rdi <=""を取り出す
00000023 call FFFFFFFFF7F969D0
Console.Write(b);
00000028 mov rcx,rbx <=string.Emptyを取り出す
0000002b call FFFFFFFFF7F969D0
Console.Write(c);
00000030 mov rcx,rdi <=""を取り出す
00000033 call FFFFFFFFF7F969D0
Console.Write(d);
00000038 mov rcx,rbx <=string.Emptyを取り出す
0000003b mov rax,642780EA8A0h
00000045 call rax
00000047 nop
00000048 add rsp,28h
0000004c pop rdi
0000004d pop rbx
0000004e rep ret
このように変数cとdの処理はどこへやら。
スタックにもヒープにも何の影響もなく処理されていることがわかります。
ここ大事。試験に出るよ。