nanoseeingの技術系ブログ

機械学習・競プロなど。アウトプットが目的。

【AtCoder】メモリ領域の話(C++)

メモリ領域に関する知識が怪しかったので調べてみた。

スタック領域に気をつける

以下のようなコードは危険

int main() {
    int dp[10000000]; //ローカル変数に巨大サイズの配列を宣言
}

ローカル変数を宣言すると、メモリ内の「スタック領域」と呼ばれる領域に変数が保管される。スタック領域は一般に数MB程度しかないので、巨大な配列などを宣言するとスタックオーバーフローを起こす危険がある。

解決策1(staticで静的領域に変数を保管)

int main() {
    static int dp[10000000];
}

解決策2(グローバル変数にして静的領域に変数を保管)

int dp[10000000];

int main() {
    // 処理
}

解決策3(newで動的に領域を確保)

int main() {
    int *dp = new int[10000000];
}

解決策4(vectorなら動的に領域が確保される)

int main() {
    vector<int> dp(10000000);
}

メモリ制限について

AtCoderのメモリ制限はたいてい1024MB。

下記ならギリギリACになることを確認した。

vector<long long> test(100 * 1024 * 1024); // 800MB

下記はMLE(メモリ制限超過)

vector<long long> test(128 * 1024 * 1024); //1024MB

MLEになるような問題はめったにないと思うが、過去問にはメモリ制限が小さいものもあるので、頭の片隅に入れておくとよいかも。