static変数について

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

static変数について

#1

投稿記事 by BILT » 14年前

現在ゲームを作っているのですが、実際にプレイしてみると、ゲームを進めていくうちにだんだんと処理が重くなってきているような気がします。
主に各ステージごとに関数を作っていて

void stage01(){
int static format;
int static data;
}
↑(実際はかなりたくさんあります)
というようにstaticで変数を宣言していて、このような関数がいくつもあります。処理が重くなったのは、各ステージで宣言したstatic変数が確保しているメモリが解放されないからと考えていますがそのようなことはあるのでしょうか?原因もメモリとはいえませんし、もしそれが原因だとしても解決方法が分からずにかなり苦戦しています。どなたか手を貸してください。お願いします。

box
記事: 2002
登録日時: 14年前

Re: static変数について

#2

投稿記事 by box » 14年前

BILT さんが書きました: void stage01(){
int static format;
int static data;
}
↑(実際はかなりたくさんあります)
というようにstaticで変数を宣言していて、このような関数がいくつもあります。
かなりたくさん
いくつもある
という定性的な部分を、定量的に書くとどうなりますか?

定性的なままですと、なかなかお答えしづらいところがありまして…。
ただ、定量的に書かれたからといって、私が回答できるとは限らない、ということもありまして…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
へろりくしょん
記事: 92
登録日時: 14年前
住所: 福岡

Re: static変数について

#3

投稿記事 by へろりくしょん » 14年前

BILT さんが書きました:というようにstaticで変数を宣言していて、このような関数がいくつもあります。処理が重くなったのは、各ステージで宣言したstatic変数が確保しているメモリが解放されないからと考えていますがそのようなことはあるのでしょうか?
言いたい事が今ひとつ分かりません。 この疑問文の趣旨は、static 変数が原因で処理が重くなる事ってあるの? って聞いているのですか?
それとも、static 変数が確保しているメモリが解放されないなんて事あるの? って聞いているのですか?

前者についてはまぁ、極めてレアケースではありますが、初期化のタイミングにおいて、若干の遅延が発生する事が、あると言えばあります。
ただ、初期化のタイミングにおいて。 ですから、処理を追う毎に重くなる物ではありません。
むしろ、多くの場合、関数への突入・離脱毎にメモリの確保・解放が行われない分早くなるのでは無いかと思います。 体感は出来ないと思いますが。

後者については、今回のコード例に限って言えば、static 変数の寿命は、プログラムの開始から終了までですので、そのプログラムが終了されない限りメモリが解放される事はありません。


今回の処理が重くなる件に関しては、恐らく関係無いと思いますよ。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: static変数について

#4

投稿記事 by softya(ソフト屋) » 14年前

staticは無関係でしょう。
メモリの使用量が増えていないかタスクマネージャで確認してみてください。
ロードした画像を開放していないのが一番考えられます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

BILT

Re: static変数について

#5

投稿記事 by BILT » 14年前

>boxさん
すみません。
ちゃんと書くとこんな感じですかね?
void stage01(){
int static format;
int static data;
int static effect[5000];
int static effectX[5000];
int static effectY[5000];
int static effectAngle[5000];
int static effectBlend[5000];
int static effectTime[5000];
int static effectBody[5000];
int static effectRota[5000];
}
void stage02(){
int static format;
int static data;
int static effect[5000];
int static effectX[5000];
int static effectY[5000];
int static effectAngle[5000];
int static effectBlend[5000];
int static effectTime[5000];
int static effectBody[5000];
int static effectRota[5000];
}
・・(以後同じようにstage03、stage04と続きます)

>へろりーなさん
前者の方です。すみません。
そうなんですか。staticの方が早いんですね。初めて知りました。自分は逆だと思っていたので。

>softya(ソフト屋)さん
なるほど。ロードした画像ですか。それは思いつきませんでした。試してみます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: static変数について

#6

投稿記事 by softya(ソフト屋) » 14年前

stage01とstage02ってプログラム的には何が違うのでしょうか?
変数を見る限り同じような処理を別の関数で行っているように感じますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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