掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.27084

スタックサイズ等に関して
投稿者---h3X(2006/06/07 01:18:39)


Linux, gcc でC言語プログラミングを行なっております.

教えて頂きたい事が3つあります。

1、スタックサイズというのはプログラム実行時に動的に変動するのでしょうか?
それとも処理系により,ある大きさに決められているのでしょうか?

2、スタックサイズが実行時に足りなくなった場合,プログラムはどのような挙動を示すか分らないと考えてよろしいのでしょうか?

3、以下のように外部変数として巨大な配列を確保した場合,

static int a[4294967295U];

int main(int argc, char **argv)
{

    return 0;
}

(ちなみに「4294967295U」という値は/usr/include/limits.hに書いてある unsigned int max の値です)

gccでコンパイルすると

try.c:2: error: 配列 `a' の大きさが大きすぎます
try.c:2: error: storage size of `a' isn't known
try.c:2: 警告: 'a' defined but not used

と,配列aの大きさが大きすぎるとエラーになります.
配列の大きさが「4294967295U」ですから,約4Gのメモリを確保しようとしている事になります。
このプログラムがコンパイルできなり理由は,プロセスが利用できる仮想メモリ空間は32bit CPUの場合4GBで,
その内プロセスが使えるメモリはもっと少かったような気がするので,(記憶があいまいですが)そういった理由からでしょうか?

以上3点に関してご教授下さい.
よろしくお願い致します.


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:スタックサイズ等に関して 27086 ぽへぇ 2006/06/07 07:50:29
<子記事> Re:スタックサイズ等に関して 27087 nop 2006/06/07 08:55:28


No.27086

Re:スタックサイズ等に関して
投稿者---ぽへぇ(2006/06/07 07:50:29)




>Linux, gcc でC言語プログラミングを行なっております.
その環境なら mallinfo あたりをマニュアルで見るといいかもしれません。

>1、スタックサイズというのはプログラム実行時に動的に変動するのでしょうか?
> それとも処理系により,ある大きさに決められているのでしょうか?

一般に、どう振舞うかはシステム依存です。

>2、スタックサイズが実行時に足りなくなった場合,プログラムはどのような挙動を示すか分らないと考えてよろしいのでしょうか?

スタックが実行時に足りなくなった場合OSがプログラムを止めてくれることを期待してもいいとは思いますが、
期待できない場合はどうなるかわかりません。

mallocのように動的に取る場合は、確保できない時はNULLが返ってくるので、それを見て判断します。
 何万回も再帰するような関数を(VC++で)書いたことがありますが、結局ワーストケースを考えて、それに間に合うようなスタックサイズをコンパイラオプションに渡して済ましました(根本的な解決にはなっていない)。

>3、以下のように外部変数として巨大な配列を確保した場合,
>その内プロセスが使えるメモリはもっと少かったような気がするので,(記憶があいまいですが)そういった理由からでしょうか?

コンパイラの言うことをもうちょっと信用してあげてもいいような。
>try.c:2: error: 配列 `a' の大きさが大きすぎます

http://www.kouno.jp/home/c_faq/c19.html#22
http://www.kouno.jp/home/c_faq/c19.html#23
も参照のこと。



この投稿にコメントする

削除パスワード

No.27089

Re:スタックサイズ等に関して
投稿者---h3X(2006/06/07 11:17:57)


>その環境なら mallinfo あたりをマニュアルで見るといいかもしれません。

早速確認してみます.

他2,3に関してもご回答ありがとうございます.
参考になりました。



この投稿にコメントする

削除パスワード

No.27087

Re:スタックサイズ等に関して
投稿者---nop(2006/06/07 08:55:28)


ついでに...

>static int a[4294967295U];
>配列の大きさが「4294967295U」ですから,約4Gのメモリを確保しようとしている事になります。

違います。

  sizeof(int) × 4294967295U

です。


この投稿にコメントする

削除パスワード

No.27088

Re:スタックサイズ等に関して
投稿者---h3X(2006/06/07 11:16:05)


>ついでに...
>
>>static int a[4294967295U];
>>配列の大きさが「4294967295U」ですから,約4Gのメモリを確保しようとしている事になります。
>
>違います。
>
>  sizeof(int) × 4294967295U
>
>です。

おはずかしい。
おっしゃる通りです。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧