変数がメモリ上でどのように配置されているかメモ

#概要

変数がどのようにメモリ上に配置されているのか。
様々なパターンで検証、その個人的メモ。

環境
Visual Studio 2013

#グローバル変数

##全てint型

```cpp:コード
int n0 = 0xfffffff0;
int n1 = 0xfffffff1;
int n2 = 0xfffffff2;
```

```text:メモリ
0x01293000  f0 ff ff ff
0x01293004  f1 ff ff ff
0x01293008  f2 ff ff ff
```

##全てshort型

```cpp:コード
short n0 = 0xfff0;
short n1 = 0xfff1;
short n2 = 0xfff2;
```

```text:メモリ
0x00AB3000  f0 ff 00 00
0x00AB3004  f1 ff 00 00
0x00AB3008  f2 ff 00 00
```

詰めないで配置される。

##全てchar型

```cpp:コード
char f0 = 0xf0;
char f1 = 0xf1;
char f2 = 0xf2;
```

```text:メモリ
0x00CA300A  f0 f1 f2 00
```

詰めて配置される。

##混合1

```cpp:コード
int f0 = 0xfffffff0;
short f1 = 0xfff1;
char f2 = 0xf2;
```

```text:メモリ
0x01073000  f0 ff ff ff
0x01073004  f1 ff f2 00
```

short型の後ろにchar型が詰めて配置されている。

##混合2

```cpp:コード
int f0 = 0xfffffff0;
short f1 = 0xfff1;
short f2 = 0xfff2;
```

```text:メモリ
0x003F3000  f0 ff ff ff
0x003F3004  f1 ff 00 00
0x003F3008  f2 ff 00 00
```

##混合3

```cpp:コード
short f0 = 0xfff0;
int f1 = 0xfffffff1;
short f2 = 0xfff2;
```

```text:メモリ
0x01413000  f0 ff 00 00
0x01413004  f1 ff ff ff
0x01413008  f2 ff 00 00
```

##混合4

```cpp:コード
char f0 = 0xf0;
int f1 = 0xfffffff1;
char f2 = 0xf2;
```

```text:メモリ
0x01023000  f0 f2 00 00
0x01023004  f1 ff ff ff
```

順番が入れ替えられて、char型がまとめて詰めて配置されている。

#ローカル変数

(※Debugビルド環境)

##全てint型

```cpp:コード
int f0 = 0xfffffff0;
int f1 = 0xfffffff1;
int f2 = 0xfffffff2;
```

```text:メモリ
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型

```cpp:コード
short f0 = 0xfff0;
short f1 = 0xfff1;
short f2 = 0xfff2;
```

```text:メモリ
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型

```cpp:コード
char f0 = 0xf0;
char f1 = 0xf1;
char f2 = 0xf2;
```

```text:メモリ
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

```cpp:コード
int f0 = 0xfffffff0;
short f1 = 0xfff1;
char f2 = 0xf2;
```

```text:メモリ
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

```cpp:コード
int f0 = 0xfffffff0;
short f1 = 0xfff1;
short f2 = 0xfff2;
```

```text:メモリ
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

```cpp:コード
short f0 = 0xfff0;
int f1 = 0xfffffff1;
short f2 = 0xfff2;
```

```text:メモリ
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

```cpp:コード
int f0 = 0xfffffff0;
char f1 = 0xf1;
char f2 = 0xf2;
```

```text:メモリ
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

```cpp:コード
char f0 = 0xf0;
int f1 = 0xfffffff1;
char f2 = 0xf2;
```

```text:メモリ
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版ビルドによってできる。バグ検出用。(※コメントより)

#構造体

```cpp:備考
struct Test{
    int f0 = 0xfffffff0;
};

Test obj;    // A

int main(){
    Test obj;    // B
}
```

格納されるメモリ領域は違うが、グローバル変数として宣言(A)してもローカル変数として宣言(B)してもメモリ上の並び方は同じ模様。

##全てint型

```cpp:コード
struct Test{
    int f0 = 0xfffffff0;
    int f1 = 0xfffffff1;
    int f2 = 0xfffffff2;
};
```

```text:メモリ
0x01025840  f0 ff ff ff
0x01025844  f1 ff ff ff
0x01025848  f2 ff ff ff
```

##全てshort型

```cpp:コード
struct Test{
    short f0 = 0xfff0;
    short f1 = 0xfff1;
    short f2 = 0xfff2;
};
```

```text:メモリ
0x00975840  f0 ff f1 ff
0x00975844  f2 ff 00 01
```

##全てchar型

```cpp:コード
struct Test{
    char f0 = 0xf0;
    char f1 = 0xf1;
    char f2 = 0xf2;
};
```

```text:メモリ
0x00965840  f0 f1 f2 00
```

##混合1

(※コメントから追加)

```cpp:コード
struct Test{
    int f0 = 0xfffffff0;
    char f1 = 0xf1;
    short f2 = 0xfff2;
    char f3 = 0xf3;
};
```

```text:メモリ
0x00235840  f0 ff ff ff
0x00235844  f1 00 f2 ff
0x00235848  f3 00 00 00
```

ある程度詰めて配置されているが、`f1(char)`と`f2(short)`の間は詰められていない。

##混合2

(※コメントから追加)

```cpp:コード
struct Test{
    char f0 = 0xf0;
    int f1 = 0xfffffff1;
    char f2 = 0xf2;
    short f3 = 0xfff3;
};
```

```text:メモリ
0x00C35840  f0 00 00 00
0x00C35844  f1 ff ff ff
0x00C35848  f2 00 f3 ff
```

`f0(char)`と`f1(int)`の間、`f2(char)`と`f3(short)`の間は詰められていない。

##混合3

```cpp:コード
struct Test{
    char f0 = 0xf0;
    char f1 = 0xf1;
    short f2 = 0xfff2;
    int f3 = 0xfffffff3;
};
```

```text:メモリ
0x003D5840  f0 f1 f2 ff
0x003D5844  f3 ff ff ff
```

隙間なく並んでいる。

#クラス

構造体と同じ