C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: boolはなぜ8bit


(過去ログ 131 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■77388 / inTopicNo.1)  boolはなぜ8bit
  
□投稿者/ KH (2回)-(2015/10/16(Fri) 09:44:58)

分類:[.NET 全般] 

まずはこちらのページをご参照いただきたいのですが
http://park1.wakwak.com/~ima/dotnet_cs_datatypes.html
boolが8bitの型なのが意外でした
てっきり1bitかと思っていました。

bool? というのもあるようでこれはnullも値になるので
true false null の3通りですから2bitで済むはずかと思います。

どうしてboolは8bitなのでしょうか?
ご説明できる方いらっしゃいましたらよろしくお願い申し上げます。
引用返信 編集キー/
■77390 / inTopicNo.2)  Re[1]: boolはなぜ8bit
□投稿者/ ぽぴ王子 (32回)-(2015/10/16(Fri) 10:14:45)
ぽぴ王子 さんの Web サイト
No77388 (KH さん) に返信
> どうしてboolは8bitなのでしょうか?
> ご説明できる方いらっしゃいましたらよろしくお願い申し上げます。

※これは私の思うところで、完璧な回答ではありません。

bool は true と false の2種類しか値を持たない( null 許容型を除く)わけですけれども
「 2 種類しか値を持たないから 1 bit でいいや」というものでもないと思うのです。
実際のところ、同じような疑問を持たれている方はいらっしゃるようで、こんなものもありました。
http://stackoverflow.com/questions/17745234/why-isnt-the-size-of-a-bool-data-type-only-1-bit-in-c?lq=1

雰囲気で読むと「アドレス指定可能な最小サイズが 8 ビット( 1 バイト)だからなの?」「そうだよ」
という流れになっているようです(あ、雰囲気で斜め読みしたので違うかもしれないです)。
例えば bool を 1 ビットで制御しようとしたとき、 1 バイトは 8 ビットなので、 8 個の bool を
格納できるじゃん!すげえじゃん!と思いますが、その 8 ビットから 1 ビットを操作するためには
結構面倒な処理が入るわけです。

1. 8 ビットの値を取り出す
2. 目的となるビットをマスクする値を計算
3. 取り出した値をマスク
4. マスクした結果を true あるいは false とする

これが 8 ビットだと

1. 8 ビットの値を取り出す
2. マスクした結果を 0 あるいはそれ以外で true あるいは false とする

と、かなり処理が簡単になるのだと思うのです。
加えて、昔の 8 ビット PC と違って、今はそれなりにメモリも潤沢ですから true と false しか
取らない型だからと言って無理に 1 ビットに収める必要もないんじゃない?と思ったりします。

あくまで私の考えなのですが、だいたいそんなところなのではないかと思いますよ。
引用返信 編集キー/
■77392 / inTopicNo.3)  Re[2]: boolはなぜ8bit
□投稿者/ PANG2 (91回)-(2015/10/16(Fri) 10:43:07)
bool型が8bitだという正式な情報は何処にありますか?


Debug.WriteLine(sizeof(bool)); // 1
bool a = true;
Debug.WriteLine(Marshal.SizeOf(a)); // 4

sizeofの戻り値はint型なので1bitを表せない
32bit CPUだと4byteの方が扱いやすい

引用返信 編集キー/
■77393 / inTopicNo.4)  Re[3]: boolはなぜ8bit
□投稿者/ 774RR (325回)-(2015/10/16(Fri) 11:53:06)
> bool型が8bitだという正式な情報は何処にありますか?
この辺かな
https://msdn.microsoft.com/ja-jp/library/eahchzkf.aspx
System.Runtime.InteropServices.Marshal.SizeOf は sizeof と同じ結果を返さないってある。

https://msdn.microsoft.com/en-us/library/system.boolean.aspx
unsafe で使うことができて LSB 1ビットに意味があると書いてある。

bool を1ビットとしない理由はオイラもぽぴ王子さんと同じく、性能向上のためだと思う。
複数個の bool (端的には bool 配列) があるとき、注目中の bool が何ビット目かを計算するのは
それなりに時間の無駄っぽい気がする。

C++98 の std::vector<bool> は bool 1個を 1bit で実装できるようになってるけど、
限りなく鬼門になってるんで・・・
引用返信 編集キー/
■77401 / inTopicNo.5)  Re[4]: boolはなぜ8bit
□投稿者/ PATIO (2回)-(2015/10/16(Fri) 17:32:43)
ども、PATIOです。
私も

> 「アドレス指定可能な最小サイズが 8 ビット( 1 バイト)だからなの?」「そうだよ」
> という流れになっているようです(あ、雰囲気で斜め読みしたので違うかもしれないです)。

という理解で概ね良いと思います。
一般的にプログラム中でデータを指し示す時にバイト単位のアドレスで表現します。
ビット単位で管理してしまうとアドレスとビット位置の両方を管理する羽目になり、
boolの為だけに特殊な管理をする羽目になります。

パフォーマンスの面でも単純にTrueとFalseを処理したいだけなのにintやlongより
パフォーマンスが落ちてしまうのも意味がないので他の方も書かれているように
その処理系で極端にパフォーマンスが落ちない単位で取り扱っているという事では
ないでしょうか。

ファイルフォーマットの様にとにかく詰め込みたいとか、無駄を極力排除したいとか
そういう意図をもってデータ構造を設計する時は1ビットで扱うケースもあると思いますが、
メモリ上で扱う場合は余程メモリを節約する必要があるケースでもない限りは、
扱いやすいサイズで取り扱うことになるでしょう。
まあ、組み込み系のシステムとかになるとそういうケースもあると思います。


引用返信 編集キー/
■77403 / inTopicNo.6)  Re[5]: boolはなぜ8bit
□投稿者/ PANG2 (92回)-(2015/10/16(Fri) 18:27:40)
うろ覚えだけど、旧VBでは2byte、MS C++ では4byteだったかな。
C#の言語仕様として1byteと記述する根拠がわからないです。

データ型の概要 (Visual Basic)
https://msdn.microsoft.com/ja-jp/library/47zceaw7.aspx

こちらの表では、共通言語ランタイムの型構造のBooleanの「ストレージ割り当ての公称サイズ」は
「実装するプラットフォームに依存」とあります。
引用返信 編集キー/
■77405 / inTopicNo.7)  Re[6]: boolはなぜ8bit
□投稿者/ KH (3回)-(2015/10/16(Fri) 20:18:20)
2015/10/17(Sat) 23:34:08 編集(投稿者)
2015/10/17(Sat) 23:34:02 編集(投稿者)

皆さま、たくさんのご回答誠にありがとうございます。
基本的な事でも謎があったりするのですね。
とても楽しかったです。
解決済み
引用返信 編集キー/
■77406 / inTopicNo.8)  Re[6]: boolはなぜ8bit
□投稿者/ 魔界の仮面弁士 (533回)-(2015/10/16(Fri) 21:21:45)
No77403 (PANG2 さん) に返信
> うろ覚えだけど、旧VBでは2byte、MS C++ では4byteだったかな。

VB の最初のバージョンは、16bit OS の時代なので、
2 バイトサイズの方が効率が良かったのでしょうね。

VB2 において、True とは 0xFFFF 、False とは 0x0000 のことでした。
この当時はまだ Boolean 型は無く、Variant 変数に放り込むと、
True は Integer 型の -1、False は 0 で管理されました。
65535 ではなく -1 なのは、VB の 16bit整数型が符号付だったため。

16bit/32bit の橋渡しとなった VB4 の Boolean 型は、
16bit版/32bit版ともに、2 バイトのデータ型でした。
これは、4 バイト化するよりも混乱が少ないとの判断なのだと思います。

ちなみに VT_BOOL な COM Variant 、いわゆる VARIANT_BOOL としての定義は
typedef short VARIANT_BOOL;
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)
ですね。


C / C++ 界隈の歴史的事情は知らないのですが、とりあえず
Windows 開発に限定してみた場合、ブール型は
 BOOLEAN … 1 バイト (WinNT.h)
 boolean … 1 バイト (WinNT.h)
 BOOL … 4 バイト (WinDef.h)
が定義されているようですね。

ただ、C++ の bool 型のサイズについては微妙なところ。
Visual C++ 5.0 では 4 バイトで
Visual C++ 6.0 では 1 バイトなのだとか。
ISO/IEC 14882:1998 5.5.3 を見るかぎり、実装依存のようです。


このように曖昧では困ると思ったのか、C# の bool では、
言語仕様において、明確にサイズを定義したのでしょう。
1 bit でも 4 バイトでもなく、1 バイトと。(C# 言語仕様 4.1.8)


> C#の言語仕様として1byteと記述する根拠がわからないです。

2 バイトや 4 バイトでない理由はさておき、少なくとも 1 bit だと
いろいろと都合が悪そうです。処理効率の面もそうですし、言語仕様でも。

たとえば sizeof。これは「変数のバイト数を int 型で返す」という仕様なので、
1 バイト未満のサイズがあると困ってしまいます。
(bit 単位で値を返すキーワードを作れば対処できるのでしょうけれど)



> 共通言語ランタイムの型構造のBooleanの「ストレージ割り当ての公称サイズ」は
> 「実装するプラットフォームに依存」とあります。

CLR の定義って、どこにあるんでしたっけ…。
CLI については、ECMA-335 の III.1.1 Data types にこんな記述が。

-----
III.1.1.2 Boolean data type

 A CLI Boolean type occupies 1 byte in memory.
 A bit pattern of all zeroes denotes a value of false.
 A bit pattern with any one or more bits set
 (analogous to a non-zero integer) denotes a value of true.
 For the purpose of stack operations boolean values are
 treated as unsigned 1-byte integers (§III.1.1.1).
-----

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -