1

今日、奇妙なエラーに遭遇しましたが、まだ理解できません:

long long N = 2000;
long long N2 = N*N;
long long *s = malloc(sizeof(long long)*N2); // create array
// populate it
for (long long k = 1; k <= 55; k++) {

エラーは発生しませんが、

long long N = 2000;
long long N2 = N*N;
long long s[4000000]; // create array
// populate it
for (long long k = 1; k <= 55; k++) {

別の 8 バイト変数を割り当てるスペースが残っていないかのように、(デバッガーによると) k に 1 を割り当てるforに、行にcode=2 EXC_BAD_ACCESS が表示されます。このコードはメソッドの先頭にあります。他の変数は割り当てられていません。4000000要素のlong long配列をスタックに割り当てることはできないと思いますが、どうにかして動的ヒープに割り当てることができます。誰かが何が起こっているのか、制限は何かなどを説明してもらえますか? これは、Mountain Lion、2GB RAM を実行する Mac 上の Objective-C です。long long は幅が 8 バイトであるため、配列は 32MB のみにする必要があります。なぜこれが問題になるのかわかりません。

ありがとうございました!

(ちなみに、詳細に見覚えがあるように見えるのは、これがプロジェクト オイラーの問題 149の私のソルバーの始まりだからです。私は既に問題を解決しているので、ここで解決策の詳細について言及することは避けました。)

4

2 に答える 2

3

最初の例では、「データ セグメント」にあるヒープからメモリを割り当て、2 番目の例では、「スタック セグメント」にあるスタックにメモリを割り当てます。これらにはそれぞれ異なるサイズ制限があります。

Technical Q&A QA1419によると、デフォルトのスタック セグメント サイズの制限は 8 MiB です。ulimit -aターミナルで実行することで、これを再確認できます。

:; ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 256
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

ご覧のとおり、スタック サイズは 8192 KiB = 8 MiB に制限されています。

上でリンクしたテクニカル Q&A では、スタック サイズの制限を増やすいくつかの方法について説明しています。root として実行せずに増やすことができる最大値は 64 MiB です。

スレッドを作成すると、各スレッドは独自のスタックを取得します。NSThreadQ&Aによると、 APIを使えばスレッドのスタックサイズを1GiBまで設定できるとのこと。

于 2012-09-13T21:20:14.583 に答える
2

自動ローカルはスタックに割り当てられます。このテクニカル ノートによると、OSX プロセスのメイン スレッドのデフォルトのスタック サイズは 8MB であり、追加のスレッドではそれ以下です。メモに記載されているリンカー オプションまたはsetrlimit解決策を試すことができますが、C の伝統では、大きな割り当てにはヒープを使用します。

于 2012-09-13T21:19:35.337 に答える