- PR -

intは何でできてるの?

投稿者投稿内容
Muse
常連さん
会議室デビュー日: 2002/03/08
投稿数: 34
投稿日時: 2002-05-23 14:23
こんにちは。
C#のintについて、質問があります。
intはSystem.Int32というstructであることは、WinCVで見ても分かるのですが、この中には、int型のフィールドがありません。自分で言っててもおかしな話だとは思うのですが、実際のところ、System.Int32は符号付き32ビットのフィールドをもっている筈で、System.Int32のメソッドはこのフィールドにアクセスしていると思うのです。
Cライブラリならアセンブラで作られていると説明できるのですが、intというのは一体全体、何でできているのでしょう? ILで直接作られているでしょうか?

[ メッセージ編集済み 編集者: すえぞう 編集日時 2002-05-23 14:24 ]

[ メッセージ編集済み 編集者: すえぞう 編集日時 2002-05-23 14:26 ]
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2002-05-23 15:20
The Shared Source CLI Betaから落としたsscli20020326.tgzのsscli/clr/src/bcl/system/int32.csによれば。

コード:
namespace System {
(中略)
    public struct Int32 : IComparable, IFormattable, IConvertible
    {
        internal int m_value;
(後略)


 ですので、m_valueというメンバーがあって、それが32bit整数値を保持しているのでしょう。
 ただし、.NET Frameworkでも同じ実装かどうかは分かりません。
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2002-05-23 15:35
 ちょっと気になったので、もう少し調べてみました。
 どうも、WinCVは、/show:internalとしても、internalな項目を表示しないようです。
 ですので、WinCVで表示されないことは、internalなメンバが存在しない証明にはならないようです。
Muse
常連さん
会議室デビュー日: 2002/03/08
投稿数: 34
投稿日時: 2002-05-23 16:00
返信ありがとうございます。
わたしもCLIのソースをダウンロードして見てみました。
確かにm_valueというinternal fieldが存在しますね。
でも、intっていうのは確かプリミティブ型ではなくオブジェクト型なんですよね?
う〜ん、さっきから「鶏が先か卵が先か」という感じで頭の中がぐるぐる回っています。
intというものがSystem.Int32の「別名」ということであれば、Cで言うところの
typdef int System.Int32;
というようなニュアンスのC#による定義がどこかに記述されているのかもしれませんね。

ちょっと気になったのがWinCV(.NET Frameworkのツール)だと
struct int { … }
というふうに見えているのに、
The Shared Source CLI Betaだと
struct Int32 { … }
というふうに記述されている点です。WinCVがわざわざInt32をintに変換して見せているのかもしれません。

C#のコイパイラはintをコンパイルするときに、混乱しないのでしょうか?
intはSystem.Int32型である→System.Int32の中にあるm_Valueはint型である→intはSystem.Int32型である・・・以下、略
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2002-05-23 16:42
 確かに今のままだと循環定義になっている可能性がありますね。
 ここから先は私にも分かりません。詳しい人の解説希望。
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-05-23 17:21
混乱はしないでしょう。System.Int32は値型であり、CILにそれを扱うop-codeが規定されています。ですから、下記のようなコードは、
コード:
	int i = 0;



こんな風に実装されるわけではありません。
コード:
	call newobj [mscorlib]System.Int32..ctor()



そうではなく、こう実装されます。
コード:
	ldc.i4.0



System.Int32のm_valueのような構造が使われるのは、ボックス化が行われたときだけです。値型のボックス化形式はヒープ上に取られますから、ヒープ上のある32ビットの領域がm_valueによって占有されることになります。ただそれだけです。
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2002-05-23 17:56
 それでは。
 まず、C# 言語の仕様の4.1.3 単純型では、「単純型は予約語を使って示されますが、これらの予約語は、System 名前空間で定義済みの構造体型に対するエイリアスでしかありません。」とされています。
 つまり、intはSystem.Int32のエイリアスでしかないことになります。
 すると、
internal int m_value;
 は、エイリアスを正規の名前に置き換えると、
internal System.Int32 m_value;
 になります。
 しかし、
コード:
	public struct A
	{
		private A a;
	}


 はVS.NETでビルドすると「型 'ClassLibrary2.A' の構造体メンバ 'ClassLibrary2.A.a' により、構造体レイアウトで循環参照が発生します。」というエラーになるので、System.Int32のメンバにSystem.Int32があることは、あり得ない話のような気がします。
 もし、intはSystem.Int32と違うものだから書けるのだ、ということになると、最初の「エイリアスでしかありません」という説明が成り立たなくなります。
 という疑問はどうでしょうか?
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-05-23 21:58
前の書き込みを読んでください。ある一群の型にはop-codeが定義されている=CLRが扱い方を知っていると書いています。

ECMA-334(p18-ln18)、ECMA-335(Partition I p.27-ln40)を見てください。両方ともに、System.Int32などのPrimitive(Built-in)typeが特別に扱われることに関する記述があります。

スキルアップ/キャリアアップ(JOB@IT)