🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

2297閲覧

配列をグローバルで宣言する理由

encho

総合スコア182

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/11/22 05:20

#配列をグローバルで宣言する理由

C++を用いて競技プログラミングを行っていますが、配列をグローバルで宣言している人が多いように思います。

いくつかの関数で利用するのであればそういった意図はわかるのですが、
main関数のみで利用するのにもかかわらず、グローバルで宣言しているのをよく見ます。

例: 動的計画法に関する問題 配列をグローバルで宣言している

main関数の具体的な中身については今回の質問では直接、関係はありません。

cpp

1#include <bits/stdc++.h> 2using namespace std; 3using ll = long long; 4template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; } 5template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; } 6 7// 入力 8int N; 9long long a[100010][3]; // 配列をグローバルで宣言 10 11// DP テーブル グローバルで宣言 12long long dp[100010][3]; 13 14int main() { 15 int N; cin >> N; 16 for (int i = 0; i < N; ++i) for (int j = 0; j < 3; ++j) cin >> a[i][j]; 17 18 // ループ 19 for (int i = 0; i < N; ++i) { 20 for (int j = 0; j < 3; ++j) { 21 for (int k = 0; k < 3; ++k) { 22 if (j == k) continue; 23 chmax(dp[i + 1][k], dp[i][j] + a[i][k]); 24 } 25 } 26 } 27 28 long long res = 0; 29 for (int j = 0; j < 3; ++j) chmax(res, dp[N][j]); 30 cout << res << endl; 31}

質問

上記のような例を考えて、グローバルで配列を宣言するメリットや理由を教えていただければと思います。
ご存知の方がいましたら、お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/11/22 05:56

ローカルにすると、スタックが壊れるからでは?
guest

回答3

0

限られた時間で要求通りの結果を得るために、要求されていない部分(動的にメモリを確保するとか)で時間を取られたくないからそうなるわけで、長期間保守するコードとは書き方が変わってしまうのでしょう。

投稿2020/11/22 06:17

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

一般的にローカル変数で定義すると、その領域はスタック領域に取られます。
が、スタック領域というのはせいぜい数M~数十MByteしか取られません。
そのような大きな配列領域をスタックで確保しようとすると、スタックを食いつぶしてしまい、正常に動作しなくなります

投稿2020/11/22 05:59

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

競技プログラミングであるため、時間的な制約が大きいと考えます。
データ領域に定義すれば、スタックの消費量を気にする必要はありません。
また、動的割付で、割り当てるコードを書く必要もありません。
時間を優先した、実装ではないでしょうか。

投稿2020/11/22 09:53

akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問