LoginSignup
1
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-12

概要

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

環境
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

隙間なく並んでいる。

クラス

構造体と同じ

1
2
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2