概要
変数がどのようにメモリ上に配置されているのか。
様々なパターンで検証、その個人的メモ。
環境
Visual Studio 2013
グローバル変数
全てint型
コード
int n0 = 0xfffffff0;
int n1 = 0xfffffff1;
int n2 = 0xfffffff2;
メモリ
0x01293000 f0 ff ff ff
0x01293004 f1 ff ff ff
0x01293008 f2 ff ff ff
全てshort型
コード
short n0 = 0xfff0;
short n1 = 0xfff1;
short n2 = 0xfff2;
メモリ
0x00AB3000 f0 ff 00 00
0x00AB3004 f1 ff 00 00
0x00AB3008 f2 ff 00 00
詰めないで配置される。
全てchar型
コード
char f0 = 0xf0;
char f1 = 0xf1;
char f2 = 0xf2;
メモリ
0x00CA300A f0 f1 f2 00
詰めて配置される。
混合1
コード
int f0 = 0xfffffff0;
short f1 = 0xfff1;
char f2 = 0xf2;
メモリ
0x01073000 f0 ff ff ff
0x01073004 f1 ff f2 00
short型の後ろにchar型が詰めて配置されている。
混合2
コード
int f0 = 0xfffffff0;
short f1 = 0xfff1;
short f2 = 0xfff2;
メモリ
0x003F3000 f0 ff ff ff
0x003F3004 f1 ff 00 00
0x003F3008 f2 ff 00 00
混合3
コード
short f0 = 0xfff0;
int f1 = 0xfffffff1;
short f2 = 0xfff2;
メモリ
0x01413000 f0 ff 00 00
0x01413004 f1 ff ff ff
0x01413008 f2 ff 00 00
混合4
コード
char f0 = 0xf0;
int f1 = 0xfffffff1;
char f2 = 0xf2;
メモリ
0x01023000 f0 f2 00 00
0x01023004 f1 ff ff ff
順番が入れ替えられて、char型がまとめて詰めて配置されている。
ローカル変数
(※Debugビルド環境)
全てint型
コード
int f0 = 0xfffffff0;
int f1 = 0xfffffff1;
int f2 = 0xfffffff2;
メモリ
0x0031F90C cc cc cc cc
0x0031F910 f2 ff ff ff
0x0031F914 cc cc cc cc
0x0031F918 cc cc cc cc
0x0031F91C f1 ff ff ff
0x0031F920 cc cc cc cc
0x0031F924 cc cc cc cc
0x0031F928 f0 ff ff ff
0x0031F92C cc cc cc cc
全てshort型
コード
short f0 = 0xfff0;
short f1 = 0xfff1;
short f2 = 0xfff2;
メモリ
0x002AFE54 cc cc cc cc
0x002AFE58 f2 ff cc cc
0x002AFE5C cc cc cc cc
0x002AFE60 cc cc cc cc
0x002AFE64 f1 ff cc cc
0x002AFE68 cc cc cc cc
0x002AFE6C cc cc cc cc
0x002AFE70 f0 ff cc cc
0x002AFE74 cc cc cc cc
全てchar型
コード
char f0 = 0xf0;
char f1 = 0xf1;
char f2 = 0xf2;
メモリ
0x0044FAF8 cc cc cc cc
0x0044FAFC cc cc cc f2
0x0044FB00 cc cc cc cc
0x0044FB04 cc cc cc cc
0x0044FB08 cc cc cc f1
0x0044FB0C cc cc cc cc
0x0044FB10 cc cc cc cc
0x0044FB14 cc cc cc f0
0x0044FB18 cc cc cc cc
混合1
コード
int f0 = 0xfffffff0;
short f1 = 0xfff1;
char f2 = 0xf2;
メモリ
0x0024FA10 cc cc cc cc
0x0024FA14 cc cc cc f2
0x0024FA18 cc cc cc cc
0x0024FA1C cc cc cc cc
0x0024FA20 f1 ff cc cc
0x0024FA24 cc cc cc cc
0x0024FA28 cc cc cc cc
0x0024FA2C f0 ff ff ff
0x0024FA30 cc cc cc cc
混合2
コード
int f0 = 0xfffffff0;
short f1 = 0xfff1;
short f2 = 0xfff2;
メモリ
0x002AFB4C cc cc cc cc
0x002AFB50 f2 ff cc cc
0x002AFB54 cc cc cc cc
0x002AFB58 cc cc cc cc
0x002AFB5C f1 ff cc cc
0x002AFB60 cc cc cc cc
0x002AFB64 cc cc cc cc
0x002AFB68 f0 ff ff ff
0x002AFB6C cc cc cc cc
混合3
コード
short f0 = 0xfff0;
int f1 = 0xfffffff1;
short f2 = 0xfff2;
メモリ
0x0026FAAC cc cc cc cc
0x0026FAB0 f2 ff cc cc
0x0026FAB4 cc cc cc cc
0x0026FAB8 cc cc cc cc
0x0026FABC f1 ff ff ff
0x0026FAC0 cc cc cc cc
0x0026FAC4 cc cc cc cc
0x0026FAC8 f0 ff cc cc
0x0026FACC cc cc cc cc
混合4
コード
int f0 = 0xfffffff0;
char f1 = 0xf1;
char f2 = 0xf2;
メモリ
0x0045FBDC cc cc cc cc
0x0045FBE0 cc cc cc f2
0x0045FBE4 cc cc cc cc
0x0045FBE8 cc cc cc cc
0x0045FBEC cc cc cc f1
0x0045FBF0 cc cc cc cc
0x0045FBF4 cc cc cc cc
0x0045FBF8 f0 ff ff ff
0x0045FBFC cc cc cc cc
混合5
コード
char f0 = 0xf0;
int f1 = 0xfffffff1;
char f2 = 0xf2;
メモリ
0x001BFDA4 cc cc cc cc
0x001BFDA8 cc cc cc f2
0x001BFDAC cc cc cc cc
0x001BFDB0 cc cc cc cc
0x001BFDB4 f1 ff ff ff
0x001BFDB8 cc cc cc cc
0x001BFDBC cc cc cc cc
0x001BFDC0 cc cc cc f0
0x001BFDC4 cc cc cc cc
どの型の場合でも、間に隙間が空けられて配置される。
**追記:**この隙間はDebug版ビルドによってできる。バグ検出用。(※コメントより)
構造体
備考
struct Test{
int f0 = 0xfffffff0;
};
Test obj; // A
int main(){
Test obj; // B
}
格納されるメモリ領域は違うが、グローバル変数として宣言(A)してもローカル変数として宣言(B)してもメモリ上の並び方は同じ模様。
全てint型
コード
struct Test{
int f0 = 0xfffffff0;
int f1 = 0xfffffff1;
int f2 = 0xfffffff2;
};
メモリ
0x01025840 f0 ff ff ff
0x01025844 f1 ff ff ff
0x01025848 f2 ff ff ff
全てshort型
コード
struct Test{
short f0 = 0xfff0;
short f1 = 0xfff1;
short f2 = 0xfff2;
};
メモリ
0x00975840 f0 ff f1 ff
0x00975844 f2 ff 00 01
全てchar型
コード
struct Test{
char f0 = 0xf0;
char f1 = 0xf1;
char f2 = 0xf2;
};
メモリ
0x00965840 f0 f1 f2 00
混合1
(※コメントから追加)
コード
struct Test{
int f0 = 0xfffffff0;
char f1 = 0xf1;
short f2 = 0xfff2;
char f3 = 0xf3;
};
メモリ
0x00235840 f0 ff ff ff
0x00235844 f1 00 f2 ff
0x00235848 f3 00 00 00
ある程度詰めて配置されているが、f1(char)
とf2(short)
の間は詰められていない。
混合2
(※コメントから追加)
コード
struct Test{
char f0 = 0xf0;
int f1 = 0xfffffff1;
char f2 = 0xf2;
short f3 = 0xfff3;
};
メモリ
0x00C35840 f0 00 00 00
0x00C35844 f1 ff ff ff
0x00C35848 f2 00 f3 ff
f0(char)
とf1(int)
の間、f2(char)
とf3(short)
の間は詰められていない。
混合3
コード
struct Test{
char f0 = 0xf0;
char f1 = 0xf1;
short f2 = 0xfff2;
int f3 = 0xfffffff3;
};
メモリ
0x003D5840 f0 f1 f2 ff
0x003D5844 f3 ff ff ff
隙間なく並んでいる。
クラス
構造体と同じ