ページ 11

staticメンバ変数の実体

Posted: 2009年7月04日(土) 21:16
by dic
また質問させてもらいます

下記のソース その1をリリースモードでコンパイルすると24kbyteのexeファイルができました
その後 その2を同じくリリースモードでコンパイルしましたが同じ24kbyteでした
新しく A::b[DEF_SIZE] の実体を定義したので、その2ではできあがる実行ファイルのサイズが
増えると見込んでいたのですが そうではなかったみたいでした
とすると A::a[DEF_SIZE} も A::b[DEF_SIZE} も exe ファイルには埋め込まれてないと推測できます
するとこの変数はどこに実体があるのでしょうか?

コンパイラはVC6.0 です
//-----------------その1--------------------------
#include	<stdio.h>

#define	DEF_SIZE	10000000
class	A
{
public:
	static	int	a[DEF_SIZE];
};
int	A::a[DEF_SIZE];

int		main()
{
	return 0;
}

//--------------------その2---------------------------
#include	<stdio.h>

#define	DEF_SIZE	10000000
class	A
{
public:
	static	int	a[DEF_SIZE];
	static	int	b[DEF_SIZE];
};
int	A::a[DEF_SIZE];
int	A::b[DEF_SIZE];

int		main()
{
	return 0;
}

Re:staticメンバ変数の実体

Posted: 2009年7月04日(土) 21:41
by Justy

>するとこの変数はどこに実体があるのでしょうか?

 この静的な変数には初期値がありません。
 
 Windowsの実行ファイルの場合、こういう変数は実行ファイルの中には
静的に配置する変数(シンボル)の先頭のオフセットアドレスの情報(とサイズ)
だけがあるだけです。

 実行時にその指示に従い、メモリを割り当てると実体ができあがります。


 しかし、以下のようにコードに手を加えて初期値を入れてみてください。
 
int A::a[DEF_SIZE] = { 1 };

 A::aを初期化するためのデータが実行ファイル内に埋め込まれますので
ファイルサイズは増えます。

Re:staticメンバ変数の実体

Posted: 2009年7月04日(土) 22:25
by dic
なるほど 初期値がいるのですね
無事、ファイルサイズも増え、staticメンバ変数の実体の実情もつかめました
ありがとうございます

Re:staticメンバ変数の実体

Posted: 2009年7月04日(土) 22:26
by dic
解決しました