今までの勉強で、メモリにはデータが保存でき、そのデータの保存場所にはアドレスが付いていることがわかった。
#1つのアドレスにどれだけのデータが保存できる?
1byte(8ビット)のデータが格納できる。
つまり、1byteごとにアドレスが振られていることになる。
char型のデータは1アドレスにデータが格納されている。
int型のデータは4アドレスぶち抜きで格納されている。
char a;
short b;
int c;
long d;
long long e;
float f;
double g;
CCLOG("char型 :%p",&a);
CCLOG("short型 :%p",&b);
CCLOG("int型 :%p",&c);
CCLOG("long型 :%p",&d);
CCLOG("long long型 :%p",&e);
CCLOG("float型 :%p",&f);
CCLOG("double型 :%p",&g);
実行結果
cocos2d: char型 :0x16fd4922f
cocos2d: short型 :0x16fd4922c
cocos2d: int型 :0x16fd49228
cocos2d: long型 :0x16fd49220
cocos2d: long long型:0x16fd49218
cocos2d: float型 :0x16fd49214
cocos2d: double型 :0x16fd49208
このようにアドレスは16進数で表す。
0→1→2→3→4→5→6→7→8→9→A→B→C→D→E→F
#なぜアドレスを16進数で表現するか
16進数では2桁でちょうど1byteの数値を表現できるから。
cocos2d: char型 :0x16fd4922f
cocos2d: short型 :0x16fd4922c
ここに注目してみる。
short型
0x16fd4922c
0x16fd4922d
の2byteを使用していることがわかる。
次のchar型
0x16fd4922f
となっており、ちょうど1byte分(0x16fd4922e)が未使用になっていることがわかる。
これは、__メモリ・アライメント(位置合わせ)__という。
#メモリアライメント
64ビットのPCを使用している場合、64ビットのCPUは一度に64ビット、つまり8バイトのデータのやり取りができる。
そのときに、アクセスするデータがアクセスしやすいアドレスに入っていると効率良くアクセスできる。
メモリの未使用領域ができても、利用効率をあげるために、非連続的に確保している。