中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

レジスタの有効利用

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の処理はどこへやら。

スタックにもヒープにも何の影響もなく処理されていることがわかります。

ここ大事。試験に出るよ。

投稿日時 : 2008年4月23日 1:32

コメントを追加

# INUrnnsotKIohKwyLLG 2012/01/07 13:22 http://www.luckyvitamin.com/p-110235-dynamic-healt

Well, actually, a lot of what you write is not quite true !... well, okay, it does not matter:D

タイトル
名前
URL
コメント