ページ 1 / 1
高速参照できる定数配列の配置?
Posted: 2011年3月02日(水) 20:09
by ボルト
こんにちは
最近ごく基本問題に悩んでいます。
サイズが非常に大きい定数配列:
int X[1000] = {1,2,3,4, 9,8,7, 5, 0, .....}
これを共有して、異なるファイルの中に存在する関数から皆X参照できるようにしたいですが、
int X[1000]を*.h にすべきか、*cppにべきかよく分りません。
要は同じ内容のXが重複してメモリに生成したくないと同時みんなから高速にXを参照できるようにしたいです。
ついでに int X[1000]の前に static と const を付けるべきかどうか、
あるいは「namespace」を利用するほうはいいかどうかにも迷っています。
---- どうも高速参照するために*.hにすべきかなと思いますけれども、
やっぱり同じ内容のデータが複数生成されるのも好ましくない、、、、
どうかお助け下さい!
Re: 高速参照できる定数配列の配置?
Posted: 2011年3月03日(木) 00:18
by softya(ソフト屋)
C++の場合、ヘッダにこう書いてください。
extern const int GX[1000];
実体は次のように書きます。
念のためC++では、externがあった方が良いです。
extern const int GX[1000] = {1,2,3,4, 9,8,7, 5, 0};
constだけだと外部参照にならないためです。
書き忘れた、これで実体は1つだけとなります。
あっGXに名前を変えたのはなんとなくです。
Re: 高速参照できる定数配列の配置?
Posted: 2011年3月03日(木) 10:26
by ボルト
丁寧なご教授本当にありがとうございます。
ただ、
「extern const int GX[1000];」 は *.h に書くんですけど、
実体
extern const int GX[1000] = {1,2,3,4, 9,8,7, 5, 0};
も *.h に書くのでしょうか?
またどうぞ宜しくお願い致します。
**********
constだけだと外部参照にならないためです
**********
↑以前この事を遭遇しましたが、わけが分らなかった!
Re: 高速参照できる定数配列の配置?
Posted: 2011年3月03日(木) 10:53
by softya(ソフト屋)
実体をヘッダに書くと多重定義でリンクエラーになりますので、例えばmain.cpp一箇所だけに定義してください。
ヘッダの「extern const int GX[1000];」を介して他のソースコードからはmain.cppの実体を参照します。
こんな感じです。
コード:
// main.h
extern const int GX[1000];
// main.cpp
#include "main.h"
extern const int GX[1000] = {1,2,3,4, 9,8,7, 5, 0};//main.hをインクルードしているのでexternは省略可能。
int main()
{
sub();
}
// sub.cpp
#include "main.h"
void sub()
{
printf( "%d", GX[0] );
}
同じことを何度も書くのも何なので、こう書くことも出来ます。
コード:
// main.h
// const int 配列型を宣言
typedef const int type_ciarray[1000];
// 外部参照の宣言
extern type_ciarray GX;
// main.cpp
#include "main.h"
// 外部参照の実体
extern type_ciarray GX = {1,2,3,4, 9,8,7, 5, 0};//main.hをインクルードしているのでexternは省略可能。
int main()
{
sub();
}
// sub.cpp
#include "main.h"
void sub()
{
printf( "%d", GX[0] );
}
Re: 高速参照できる定数配列の配置?
Posted: 2011年3月03日(木) 17:14
by ボルト
お世話になります。
実例コードまで見せていただき、よく分りました。
本当に感謝の気持ちいっぱいです。
怒られるかもしれませんが、最後の一点だけご確認させて下さい。
常数データの場合(const)を参照する関数と同じ*.cppファイルに存在させるほうは
外部参照するよりアクセス速度が速いでしょうか(そういう記憶を持っていますけれども、、、)
またどうぞお願い申し上げます。
Re: 高速参照できる定数配列の配置?
Posted: 2011年3月03日(木) 17:24
by softya(ソフト屋)
ボルト さんが書きました:
怒られるかもしれませんが、最後の一点だけご確認させて下さい。
常数データの場合(const)を参照する関数と同じ*.cppファイルに存在させるほうは
外部参照するよりアクセス速度が速いでしょうか(そういう記憶を持っていますけれども、、、)
コンパイラ言語では、外部参照でも内部参照でも速度は変わりませんよ。
ただ、constのスカラ変数だとコンパイラが最適化時に実行効率を考慮して機械語命令コード内に値を組み込む場合があるので動作は早くなる可能性は高いです。
これも使うコンパイラの種類や最適化レベルやどの型をconstにしているのかとか様々な要因が絡みます。
あとCPUの種類によっても話が変わりますね。パソコンのCPUと組み込み分野のマイコンのCPUでは自ずと最適化の手法は違ってきます。
Re: 高速参照できる定数配列の配置?[お礼]
Posted: 2011年3月03日(木) 18:05
by ボルト
よく分りました。
自分はさらに勉強しなければなりません。
心からお礼を申し上げます。