0

beginthreadのスタックサイズ引数が何を意味するのか知っていると思いました。だから私の質問は:なぜこれが機能するのですか?

#include <iostream>
#include <process.h>

using namespace std;

void huge_stack(int a, int b, int c, int d)
{
    int i[100000] = {0};
    cout << a << b << c << d << i[12333] << endl;
}

bool done = false;

void thread(void* p)
{
    huge_stack(1,2,3,4);
    done = true;
}

int main()
{
    _beginthread(thread, 10, nullptr);

    while(!done) {}

    return 0;
}

デバッグモードでビルドしていることを確認したので、呼び出しと配列は最適化されません。

4

1 に答える 1

0

リザーブ スタック サイズは、通常、非常に大きく、Windows では 1MB、Linux では 8MB 程度です。これはコミット サイズとは異なることに注意してください。コミット サイズは開始点であり、通常は 4KB 程度です。スタックは、予約サイズまで自動的に拡張されます。また、予約スタックが大きい 32 ビット システムでは、仮想アドレス空間が数百スレッドですぐに不足する可能性があることに注意してください (したがって、必要に応じて、Windows リンク プロパティまたは Linux ulimit を使用してこれを調整できます)。最後に、大きなオブジェクトの場合は、とにかくヒープを使用することをお勧めします。

于 2012-10-17T18:08:43.770 に答える