staticメンバ変数の実体

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic

staticメンバ変数の実体

#1

投稿記事 by dic » 16年前

また質問させてもらいます

下記のソース その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;
}

Justy

Re:staticメンバ変数の実体

#2

投稿記事 by Justy » 16年前


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

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

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


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

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

dic

Re:staticメンバ変数の実体

#3

投稿記事 by dic » 16年前

なるほど 初期値がいるのですね
無事、ファイルサイズも増え、staticメンバ変数の実体の実情もつかめました
ありがとうございます


閉鎖

“C言語何でも質問掲示板” へ戻る