二つのマシン(機種は異なる)に同一バージョンのeclipseとJDKをインストールしています。このマシンに対してCVSからソースをチェックアウトしてきます。こういった状況下で、a.java・b.java、c.java・・・をコンパイルした場合、a.classのファイルサイズが二つの環境下で異なることはあるでしょうか?(a.javaはまったく同じソースファイルで、b.java以降はソースが異なる可能性もあります。)もし異なるなら何が原因なのかお教えください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/01/09 02:52:07
  • 終了:--

回答(2件)

id:kacchan6 No.1

kacchan6回答回数106ベストアンサー獲得回数02005/01/09 03:14:47

ポイント30pt

a.classからb.classを参照していませんか?

例えば、

public class a{

private String str = b.VALUE;

}

public class b{

public static final String VALUE = ”aaa”;

}

みたいなソースの場合、

aからはbのVALUEを参照しているので、

aのサイズは変わらないと思われがちですが、

Stringとプリミティブ型のstatic finalで宣言された値は

コンパイラの最適化フェーズで自動的に

インライン化されるため、

実質

public class a{

private String str = ”aaa”;

}

というコードをコンパイルしていることになります。

ですので、b.classの内容が変われば、

当然a.classの内容も変わることがあります。

コンパイラの実装によっても違いますが、

定数だけではなく、メソッドもバイトコードレベルでインライン化されますので、

参照先のクラスが違えば同じコードでも

コンパイル後のサイズが違うというのは十分に起こりうる現象となります。

id:yoneyore

やはりそうなのですか。ありがとうございます。勉強になります。

2005/01/09 23:49:14
id:TOT3 No.2

ほねほね回答回数12ベストアンサー獲得回数02005/01/09 09:35:55

ポイント20pt

http://java-house.jp/ml/archive/j-h-b/016071.html

[JavaHouse-Brewers:16071] [Q]:static final $B$NJ8;zNs$K$D$$$F(B

a.javaがb.java以降のstatic final な文字列を参照している場合は、staticリンクなのでその文字列を取り込んでいる場合があります。

その場合、コンパイルのタイミングでサイズが違う場合があります。

もちろん、フルビルドを行えば同一のサイズになります。

id:yoneyore

ありがとうございます。勉強になりました。

2005/01/09 23:50:34

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません