こんにちは
最近ごく基本問題に悩んでいます。
サイズが非常に大きい定数配列:
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にすべきかなと思いますけれども、
やっぱり同じ内容のデータが複数生成されるのも好ましくない、、、、
どうかお助け下さい!
高速参照できる定数配列の配置?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 高速参照できる定数配列の配置?
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に名前を変えたのはなんとなくです。
extern const int GX[1000];
実体は次のように書きます。
念のためC++では、externがあった方が良いです。
extern const int GX[1000] = {1,2,3,4, 9,8,7, 5, 0};
constだけだと外部参照にならないためです。
書き忘れた、これで実体は1つだけとなります。
あっGXに名前を変えたのはなんとなくです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
ボルト
Re: 高速参照できる定数配列の配置?
丁寧なご教授本当にありがとうございます。
ただ、
「extern const int GX[1000];」 は *.h に書くんですけど、
実体
extern const int GX[1000] = {1,2,3,4, 9,8,7, 5, 0};
も *.h に書くのでしょうか?
またどうぞ宜しくお願い致します。
**********
constだけだと外部参照にならないためです
**********
↑以前この事を遭遇しましたが、わけが分らなかった!
ただ、
「extern const int GX[1000];」 は *.h に書くんですけど、
実体
extern const int GX[1000] = {1,2,3,4, 9,8,7, 5, 0};
も *.h に書くのでしょうか?
またどうぞ宜しくお願い致します。
**********
constだけだと外部参照にならないためです
**********
↑以前この事を遭遇しましたが、わけが分らなかった!
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 高速参照できる定数配列の配置?
実体をヘッダに書くと多重定義でリンクエラーになりますので、例えばmain.cpp一箇所だけに定義してください。
ヘッダの「extern const int GX[1000];」を介して他のソースコードからは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] );
}by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
ボルト
Re: 高速参照できる定数配列の配置?
お世話になります。
実例コードまで見せていただき、よく分りました。
本当に感謝の気持ちいっぱいです。
怒られるかもしれませんが、最後の一点だけご確認させて下さい。
常数データの場合(const)を参照する関数と同じ*.cppファイルに存在させるほうは
外部参照するよりアクセス速度が速いでしょうか(そういう記憶を持っていますけれども、、、)
またどうぞお願い申し上げます。
実例コードまで見せていただき、よく分りました。
本当に感謝の気持ちいっぱいです。
怒られるかもしれませんが、最後の一点だけご確認させて下さい。
常数データの場合(const)を参照する関数と同じ*.cppファイルに存在させるほうは
外部参照するよりアクセス速度が速いでしょうか(そういう記憶を持っていますけれども、、、)
またどうぞお願い申し上げます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 高速参照できる定数配列の配置?
コンパイラ言語では、外部参照でも内部参照でも速度は変わりませんよ。ボルト さんが書きました: 怒られるかもしれませんが、最後の一点だけご確認させて下さい。
常数データの場合(const)を参照する関数と同じ*.cppファイルに存在させるほうは
外部参照するよりアクセス速度が速いでしょうか(そういう記憶を持っていますけれども、、、)
ただ、constのスカラ変数だとコンパイラが最適化時に実行効率を考慮して機械語命令コード内に値を組み込む場合があるので動作は早くなる可能性は高いです。
これも使うコンパイラの種類や最適化レベルやどの型をconstにしているのかとか様々な要因が絡みます。
あとCPUの種類によっても話が変わりますね。パソコンのCPUと組み込み分野のマイコンのCPUでは自ずと最適化の手法は違ってきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。