- PR -

booleanのバイト数

投稿者投稿内容
chienvert
ベテラン
会議室デビュー日: 2002/12/03
投稿数: 57
投稿日時: 2003-09-01 18:23
ものすごーく初歩的な質問で恐縮しますが、booleanのサイズは1バイトですよね(本当に)?
参照記事はなぜbooleanのサイズだけ括弧書きになっているのですか?
それと、1バイトでも複数形の「bytes」を使うんですね?
市販されている書籍でもbooleanだけサイズが記載されていないものが多いようですが、これはどういう背景からなのでしょうか。
超初心者なので、お手柔らかにご指導いただけると嬉しいです。
英-Ran
ベテラン
会議室デビュー日: 2002/06/12
投稿数: 55
投稿日時: 2003-09-01 20:39
Java言語仕様で定められていないからです。

Java言語におけるbooleanは1でも0でもなく、trueとfalseを持つ数値とは別の概念の型だ考えた方がいいと思います。

# どうでもいいけど、なぜ1ビットではなく1バイトと誤解するのだろうか……

JavaVMの実装する上でも、booleanをどう実装すべきかまでは定められておらず、どうも昔は「booleanは存在しない」とさえ書かれていたようです。

「参考」http://www.netgene.co.jp/java/docs/javaPressVol15.html

上記でも書かれていますが、実装上はint型と同様に扱われることがほとんどだと思いますので、booleanをいっぱい使ってもメモリの節約にはなりそうもありません(^_^;
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2003-09-01 20:51
実際にためしてみればよろしいかと。

コード:
public static void main(String[] args) {
  final int ArraySize = 1000000;
  Runtime runtime = Runtime.getRuntime();

  long used0 = runtime.totalMemory() - runtime.freeMemory();
  boolean[] boolArray = new boolean[ArraySize];
  long used1 = runtime.totalMemory() - runtime.freeMemory();
  byte[] byteArray = new byte[ArraySize];
  long used2 = runtime.totalMemory() - runtime.freeMemory();
		
  System.out.println(used1 - used0);
  System.out.println(used2 - used1);

  boolArray[ArraySize-1] = true; // GC よけ
  byteArray[ArraySize-1] = 1;
}



# このコードの間違いがありましたらご指摘ください。
chienvert
ベテラン
会議室デビュー日: 2002/12/03
投稿数: 57
投稿日時: 2003-09-07 02:50
びしばしさん、試して以下の結果が出ました。
ありがとうございます。

1000016
884336

でも、実は結果を見て、ますます分からなくなったかも・・・。
chienvert
ベテラン
会議室デビュー日: 2002/12/03
投稿数: 57
投稿日時: 2003-09-07 02:55
英-Ranさん、ありがとうございます。
S●Nの人に聞いてみたところ、やはり同様のことを言っていました。
「intだったような気がする・・・」みたいなテキトーな返事でした。(笑)

Boolean型があるというのが、Javaの特徴なんだと感心していたのですが、なーんだC言語と同じ実装なんだ!と、ちょっとガッカリです。
でも、もしかしてKVMとかでは1ビットだったりするんですかね?
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-09-07 08:11
引用:

でも、もしかしてKVMとかでは1ビットだったりするんですかね?


KVM (CLDC)でのbooleanは、確か1バイトか2バイトだったような気がします。
(定かではなくてごめんなさい。)
何れにせよ、ビット単位では扱ってないはずです。もし、確実にメモリーの節約をすると
したら、byte型が一番いいように思います。これでしたら1バイトであることが確実
なので
# ちなみにint型って4バイト食ってしまうような気が・・・。

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-09-07 08:18 ]
英-Ran
ベテラン
会議室デビュー日: 2002/06/12
投稿数: 55
投稿日時: 2003-09-07 10:19
引用:

chienvertさんの書き込み (2003-09-07 02:55) より:
Boolean型があるというのが、Javaの特徴なんだと感心していたのですが、なーんだC言語と同じ実装なんだ!と、ちょっとガッカリです。



前の投稿にも書きましたが、あくまでbooleanは「trueとfalse」をとる「型」と考えるべきで、実際に何ビットなのかというのは考えるべきじゃないでしょう。

# 数値型にキャストできないことからも明らかですが……

boolean型のサイズを云々するのは、Object型のインスタンスが何バイトなのかを云々するのと同じです。実際には、Object型のインスタンスにもサイズはあるはずですが、そんなこと気にする人はいないでしょ。

せっかくJavaでは、低レベルの機能が隠蔽されているのだから、プログラミングを作る際も「概念」で考えるようにしたほうがいいと思います。どうせ、部分的な最適化はパフォーマンスチューニングとしてほとんど意味がないわけだし。
佐々木
大ベテラン
会議室デビュー日: 2003/03/30
投稿数: 121
投稿日時: 2003-09-07 11:01
引用:

chienvertさんの書き込み (2003-09-07 02:55) より:
英-Ranさん、ありがとうございます。
S●Nの人に聞いてみたところ、やはり同様のことを言っていました。
「intだったような気がする・・・」みたいなテキトーな返事でした。(笑)

Boolean型があるというのが、Javaの特徴なんだと感心していたのですが、なーんだC言語と同じ実装なんだ!と、ちょっとガッカリです。



まぁ、大抵のJava処理系はCで書いてあるんでしょうからね。

ところで、VMの仕様書を見ると

「JVMではboolean型を定義してあるが、それは限定的なものであり、boolean型専用の命令は用意されていない。プログラミング言語Javaにおけるboolean型に対する操作は、JVMのint型に対して行われるようにコンパイルされる。」(変な訳ですみません。それにしてもこれ、仕様の定義というより特定のVMの実装の説明みたいですよね。変なの。)

とあります。なので、「booleanのサイズは?」という質問に対する答えをあえて探すとすれば「4バイト」というのが正しいのかもしれません。

ただ、僕は自分でJVMを作ったりするような技術はないので難しいことは良くわからんのですが、「intは4バイト」とかいうのは「int型の値は32bit符号付き整数を2の補数表現で表す」と言ってるだけで、「int型の変数がメモリ上で高々4バイトしか占有しない」と言っているわけではないと思うのです。値以外の付加情報ってのがあってもいいわけですよね。つまり。

例えば、参照カウンタ式のGCを採用しているようなJVMが仮に存在したとすると(今どき無いと思うけど)、int型に限らず全てのデータ型はカウンタ用の領域を必要としますよね。すると、4バイトの値域を持つint型はメモリ上で少なくとも8バイトから16バイトぐらい場所を取ることでしょう。その辺はもう処理系の実装に依存する話であって、だから「何型は何バイトメモリを食う」みたいな話はあまり意味がないと思いますね。

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