
double x[100000];
int func(void) {
static double y[100000];
.....
return 0;
}
上記のようなC言語のプログラムで、大きな要素数の静的な配列x, yを、あえて初期化させずに定義する方法があれば教えてください。C言語の仕様では、明示的な初期化の指定がなければ値0に初期化されるので、例えば上記の場合には延々と0の代入による初期化が起こるのだと思います。
アセンブラ言語であれば可能なので、”変数の定義のところだけ”アセンブラで書いてリンクするというのも可能かと思いますが、まずは(gccのオプションとかで)比較的簡単にできるのであればいいなと思います。
No.4ベストアンサー
- 回答日時:
「C言語の仕様」としてそうである以上, 「C言語の仕様」としてはどうにも動かしようがありません. 既に指摘されているようにコンパイラや OS を含めた「処理系」全体の話になるので, 「gcc」としかわからない状況ではどうにもなりません (しさらに言えば処理系の詳細が分かってもどうにもならないかもしれない).
以下は余談.
C の仕様 (9899:1999 なら section 6.7.8, 9899:2011 は未確認だけどドラフトでは section 6.7.9) に
If an object that has static storage duration is not initialized explicitly, then:
(この質問に直接関係ないところは省略)
- if it has arithmetic type, it is initialized to (positive or unsigned) zero;
- if it is an aggregate, every member is initialized (recursively) according to these rules;
って書いてあるんだけどね>#3. ついでに指摘しておくと「プログラムの実行前に初期化される」というのも (別のところに) ある.
No.3
- 回答日時:
> C言語の仕様では、明示的な初期化の指定がなければ値0に初期化されるので、
↑実際にそうなるのを確認しましたか?
C言語の仕様というよりはコンパイラの仕様で、初期化されない(明示的な初期化を伴わない)外部変数もしくはstatic変数はBSS(Block Storage Segment)へ割り付けられます。これは(コンパイラの仕様によりますが)初期化されません。コンパイラによっては、自動的もしくはオプションを指定することによってBSSを初期化するコードを生成するようにできます。
No.2
- 回答日時:
何のためにしたいのですか?
ランダムな値で埋めたい? それなら横着せず実際に乱数で埋めましょう。
0埋めの演算時間を減らしたい? OSか初期化ルーチンの範疇なので実際の実装を確認して対処しましょう。
少なくとも静的変数なら0になるのが言語仕様なのだから、そうでない動作をさせるなら裏技になります。
どこでも通用する技じゃないんで使用する環境(コンパイラ、OS、CPU)と目的が不明だとトンチンカンな
回答になりそうです。
No.1
- 回答日時:
> 上記の場合には延々と0の代入による初期化が起こるのだと思います。
> アセンブラ言語であれば可能
ということならば、アセンブリでの出力(GCCなら -Sオプション)を確認してはどうでしょうか?
実装に依存しますが、おそらく「必要な分の0の領域を用意」しているだけで、プログラムをロードした時点で0になっているのでは?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++Builder → Visual C++ 移植...
-
組み込みソフト。ROM領域にデータ
-
エディタとコンパイラ 基礎
-
DLLの呼び出され方が分かりません
-
C言語の本!
-
COBOLの論理演算子について質問...
-
turbo-Cとturbo-C++
-
#pragma プリプロセス について
-
組込みC開発
-
COBOLのALPHABET...
-
DLLファイルの逆コンパイラにつ...
-
unsigned long long 型のフォー...
-
python エラー
-
<unistd.h>をVisualStudioでつ...
-
” OS ビルド ” の意味が分か...
-
ビルドとリビルドの違いを教え...
-
res://ieframe.dll/について
-
visual studio2019でデバッグが...
-
適切な変換関数が存在しない???
-
外部依存関係について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
unsigned long long 型のフォー...
-
ソフトの開発言語を調べる方法
-
組み込みソフト。ROM領域にデータ
-
C++でデスクトップGUIアプリ開...
-
パーサとコンパイラの違いって?
-
【C言語】 型のサイズについて
-
COBOLのALPHABET...
-
<conio.h>?
-
printfなど、標準関数のソース...
-
COBOLの論理演算子について質問...
-
cc と gcc の違い
-
DLLの呼び出され方が分かりません
-
AIXとCOBOLについて
-
PICマイコンのプログラムカウン...
-
リリースモードとデバッグモー...
-
C++Builder → Visual C++ 移植...
-
C++DLLの明示的リンクに関して
-
cobolで実行環境って何ですか?
-
C言語の規格
おすすめ情報