2012年7月20日金曜日

型はメモリと演算を規定する

要点
変数の型は変数が確保するメモリのサイズを決めます。
また、変数に対してどんな演算をするのかも決めます。
------------


変数という言葉はいつでも使える言葉です。

int x;
と書いたら、int型のxという名前の変数の宣言になります。

これに対してオブジェクト(またはインスタンス)という言葉は、変数がメモリとしての実体を持った状態を指します。
つまり

int x;
という宣言の後に
x = 3;
と定義を書いて
(あるいは
int x = 3;
という風に宣言と定義を同時に書いて)

そしてさらにプログラムをビルド、実行してこのコードの部分を制御が通過した時に初めてxはオブジェクトになります。

この時、x は 3で初期化したのでメモリの何処か8ビットは

00000011 (10進数で3)
になっているはずです。

windowsならint型は32ビットなので・・・

00000000 00000000 00000000 00000011
確保したビットの量はこれくらいあるでしょう。

この様に、変数の型は変数がオブジェクトになった時にどれだけメモリを確保するかを決めます
 
そして型にはもうひとつ重要な性質があります。
それが

演算の規定

です。
ここで言う演算というのはメモリの操作の事です。

C++によるプログラミングは基本的に、型の定義によって
メモリの確保や演算の仕方を決めて行くことになります。

例えば
----------------
int x, y;

x = 1; //1で初期化(メモリの確保という演算)
y = 3;
x = y; //yを代入(代入という演算)

とか
printf("%d",x); //関数に渡されて内部の引数にコピーされる
とか
ns[3] = x; //配列に代入
とか
float f = x; //xをfloat型に代入
-----------------
等の演算があります。
つまり変数の扱い全てが演算だと言えます。
これら演算は、型の種類毎に違うのが普通です。演算が全て同じならば別の型を定義する必要がないからです。

例えば次の様にabという名前の変数を別々の型で定義したとします。

int a = 10;
float b = 10.0f;

この時、初期化が発生している訳ですが、その演算内容はintとfloatでは違います。floatは少数が扱えるデータ構造にフォーマットしないといけないからです。当然ながら四則演算もメモリの配置が違うので同じやり方を適用できません。また、intとfloat等の別の型同士の演算をする時は、一方をもう一方の型に変換してから計算が行われます。この型変換というのも一種の演算であり、型同士の種類によって規則が違います。

intやfloatの様にC++に元から組み込みまれている基本型は初めからどのような演算を適用するかが決められていますが、構造体やクラス型はプログラマが演算を定義できます。(と言って大抵はその内部で基本型とその演算を使う事になります。)

0 件のコメント: