- - PR -
intは何でできてるの?
1|2|3|4
次のページへ»
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||||||
|
投稿日時: 2002-05-23 15:20
The Shared Source CLI Betaから落としたsscli20020326.tgzのsscli/clr/src/bcl/system/int32.csによれば。
ですので、m_valueというメンバーがあって、それが32bit整数値を保持しているのでしょう。 ただし、.NET Frameworkでも同じ実装かどうかは分かりません。 | ||||||||||||
|
投稿日時: 2002-05-23 15:35
ちょっと気になったので、もう少し調べてみました。
どうも、WinCVは、/show:internalとしても、internalな項目を表示しないようです。 ですので、WinCVで表示されないことは、internalなメンバが存在しない証明にはならないようです。 | ||||||||||||
|
投稿日時: 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型である・・・以下、略 | ||||||||||||
|
投稿日時: 2002-05-23 16:42
確かに今のままだと循環定義になっている可能性がありますね。
ここから先は私にも分かりません。詳しい人の解説希望。 | ||||||||||||
|
投稿日時: 2002-05-23 17:21
混乱はしないでしょう。System.Int32は値型であり、CILにそれを扱うop-codeが規定されています。ですから、下記のようなコードは、
こんな風に実装されるわけではありません。
そうではなく、こう実装されます。
System.Int32のm_valueのような構造が使われるのは、ボックス化が行われたときだけです。値型のボックス化形式はヒープ上に取られますから、ヒープ上のある32ビットの領域がm_valueによって占有されることになります。ただそれだけです。 | ||||||||||||
|
投稿日時: 2002-05-23 17:56
それでは。
まず、C# 言語の仕様の4.1.3 単純型では、「単純型は予約語を使って示されますが、これらの予約語は、System 名前空間で定義済みの構造体型に対するエイリアスでしかありません。」とされています。 つまり、intはSystem.Int32のエイリアスでしかないことになります。 すると、 internal int m_value; は、エイリアスを正規の名前に置き換えると、 internal System.Int32 m_value; になります。 しかし、
はVS.NETでビルドすると「型 'ClassLibrary2.A' の構造体メンバ 'ClassLibrary2.A.a' により、構造体レイアウトで循環参照が発生します。」というエラーになるので、System.Int32のメンバにSystem.Int32があることは、あり得ない話のような気がします。 もし、intはSystem.Int32と違うものだから書けるのだ、ということになると、最初の「エイリアスでしかありません」という説明が成り立たなくなります。 という疑問はどうでしょうか? | ||||||||||||
|
投稿日時: 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が特別に扱われることに関する記述があります。 |
1|2|3|4
次のページへ»