いつもお世話になります。VC++6.0非MFCで開発をしております。
文字列の配列を宣言する際などに以下のようなソースをよく見ます。
void XXXX::func1(){
static char *data[4] = {
aaa, bbb, ccc, dddd ・・・ 。
};
・・・ // なんらかの処理
};
そして func1()はいろんな箇所で呼ばれているのですが、配列宣言を行っている箇所の
staticって何か利点があるのでしょうか?? 私が理解しているのはstatic宣言すれば曖
昧ではありますが
・オブジェクトが消滅するまで値が保持される
・extern とは反対に情報を隠蔽する性質
といったようなことです。
i)の箇所をstatic宣言で毎回初期化がされなくなり、処理効率がよくなるのかなぁ??
とか考えているのですが、解釈を間違えているでしょうか??
長々となりましたが、ご教授よろしくお願いします。
すいません。一部文字化けしていました。修正します
static char *data[4] = {
aaa, bbb, ccc, dddd ・・・ i)
};
です。
> i)の箇所をstatic宣言で毎回初期化がされなくなり、処理効率がよくなるのかな
ぁ??
> とか考えているのですが、解釈を間違えているでしょうか??
お試しコード書いて動かせばわかるやん。
void XXXX::func1()
{
static int count=0;
count++;
};
オブジェクトが複数で
それぞれのオブジェクトで func1()を呼び出したときの count値
オブジェクトを削除して、もう一度つくった時の count値
みてみたら
>・オブジェクトが消滅するまで値が保持される
ちがう。「プログラム終了まで値が保持される」なら正しい
>・extern とは反対に情報を隠蔽する性質
大域変数に対してはこれは正しい。
局所変数の隠蔽は { } によるスコープによって行われるので違う
>static宣言で毎回初期化がされなくなり、処理効率がよくなるのかなぁ??
この場合はそういうこと。ただしこの例では const 指定が無いので
速度向上にはなりそうだがメモリ消費量向上にはあまり寄与してない。
# っていうか典型的間違いを含んでいるわけだが
組み込み系で「効率向上のために」こーいうコードを書いている新人君がいたら
まだ青いなー、指導が必要と判断されることになるのであった
static char *data[] = {
aaa, bbb, ccc, dddd ・・・ i)
};
正しく書くと、こんな感じでしょうか。
本題から外れて、ごめんなさい。
>正しく書くと
というのは俺の発言を受けての話?もしそうなら、俺の意図はそうではない。
string literal は const char [] (または const wchar_t[]) だよ→
string literal を char * にするのは deprecated だよ→
const char* data[]={..., ...}; でないとダメだよ
と、ここまでが「典型的間違い」の解説。
んで、これ以後は元発言に出てない話を俺が勝手に脳内補完してるだけだが
「もしこの data 自体も const でよいのであれば」 // これを補完
メモリ使用効率の向上も狙いたいのであれば const の置き方が足らない。
const char* const data[]={..., ...}; なら良い。
マイコン組み込み用途だとこの3つの違いは大きい。
# PC ソフトでは大差ないかもしれんが
>>正しく書くと
>というのは俺の発言を受けての話?もしそうなら、俺の意図はそうではない。
tetrapodさん
いいえ、違います。一番最初のコードを見て思っただけです。
「典型的な間違い」は、書かれている文面から他の事だろうとは思っていました。
こう言う事だったのですね。組み込み系の経験が少ない私は、やっぱり青かったです。
解説ありがとうございました。
みなさん。ありがとうございます。
staticの扱いにまだまだ理解不足な部分もあるみたいですので、みなさんの意見を参
考にプログラムを組んでみます。いろいろありがとうございました