質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

Q&A

解決済

2回答

2597閲覧

C++ 少し大きめの配列を用意する意味はなんですか?

encho

総合スコア182

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

0グッド

0クリップ

投稿2020/10/11 01:33

編集2020/10/11 14:02

#C++ 少し大きめの配列を用意する意味はなんですか?

C++で競技プログラミングに取り組んでいますが、必要な配列よりも少し大きめの配列を準備している回答が多いです。
例えばN=1000個の入力が与えられその値をそれぞれ配列に入れるとなった場合に

int num[1000]とはせずに
int num[1050]のようにある程度大きめの配列をグローバルで宣言するコードをよく見ます。

このようなことはどうして行っているのでしょうか?
ご存知の方がいらっしゃったら教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

プログラムを書く速度を競う、という条件を前提とすれば、コードの考慮漏れで配列要素をオーバーするリスクがある場合に、余分に配列を取るコストはほぼ皆無なのに対して、配列が範囲をはみ出さないか考慮するコストは時間として負担になりえます。

投稿2020/10/11 01:36

maisumakun

総合スコア146018

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

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

maisumakun

2020/10/11 01:52

もちろん、普段のプログラミングでやってはいけない技です。
encho

2020/10/11 07:16

競技上の特性ということだったんですね。 ありがとうございます
guest

0

プログラムの実行速度を競う、という条件を前提とすれば、
配列のサイズを 2のべき乗にすることがあります。

C

1extern int a[500][1000]; 2extern int b[500][1024]; // 1000で十分なのに 2の10乗の 1024 にする 3 4int getA(int i, int j) { return a[i][j]; } 5int getB(int i, int j) { return b[i][j]; }

このコードを gcc -c -O2 でコンパイルして、objdump -d で逆アセンブルすると

text

10000000000000000 <getA>: 2 0: f3 0f 1e fa endbr64 3 4: 48 63 ff movslq %edi,%rdi 4 7: 48 63 f6 movslq %esi,%rsi 5 a: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 11 <getA+0x11> 6 11: 48 69 ff e8 03 00 00 imul $0x3e8,%rdi,%rdi 7 18: 48 01 f7 add %rsi,%rdi 8 1b: 8b 04 b8 mov (%rax,%rdi,4),%eax 9 1e: c3 retq 10 110000000000000020 <getB>: 12 20: f3 0f 1e fa endbr64 13 24: 48 63 ff movslq %edi,%rdi 14 27: 48 63 f6 movslq %esi,%rsi 15 2a: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # 31 <getB+0x11> 16 31: 48 c1 e7 0a shl $0xa,%rdi 17 35: 48 01 f7 add %rsi,%rdi 18 38: 8b 04 b8 mov (%rax,%rdi,4),%eax 19 3b: c3 retq

添字計算で、1000倍には imul という乗算命令が使われていますが、
1024倍では shl というシフト命令になっています。
シフト命令の方が乗算命令よりもクロック数が少なく速いはずです。

投稿2020/10/11 09:31

編集2020/10/11 14:49
kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問