3

これは記憶によるものなので、いくつかの単語を誤用している可能性がありますが、意味は理解できるはずです

私は現在大学にいて、プログラミングを少し専攻しています - 私たちは C++ を始めました。そして、配列を使い始めたとき、C++ の先生 (奇妙なアイデアと、コメントが一切許可されないなどのプログラミング規則を持つ先生) が、私たちにすべきだと言いました。より効率的にするために、配列サイズを 4 の倍数にします。

char exampleArrayChar[ 4 ]; //Allowed
float exampleArrayChar[ 6 ]; //NOT Allowed
int exampleArrayChar[ 8 ]; //Allowed

この背後にある理由は、コンピューターがメモリを割り当てる方法にあると彼は言いました。

コンピューターは、各配列要素のメモリ アドレス/場所を 4 バイトのグループで割り当てたので、8 要素の配列は 2 つのメモリ グループで作成されました。

したがって、サイズ 6 の配列を作成すると、4 つのグループが 2 つ割り当てられますが、それらのバイトのうち 2 つ (8 つのうち) が無効/無効としてマークされ、配列全体が解放されるまで使用できなくなるという問題がありました。メモリー。

これは、他のコンピューター数学 (正確に 1000 ではなく 1gb = 1024mb など) に関してはもっともらしいように思えますが、次のことを知りたいと思っています。

  • これがどれほど真実であり、これを行うことで得られるものがあるとすれば、
  • これはC ++だけですか?(私はそうではないと思いますが、それでも尋ねる価値があります)
  • これに関する詳細情報 - たとえば、なぜ 4 なのですか? コンピューターの数学は通常 2 進数なので 2 ではありませんか?

Web を見回しても、主な用途や関連性のあるものを見つけることができませんでした。

4

4 に答える 4

3

あなたの先生があなたが上で言っていることを本当にあなたに言ったと仮定すると、あなたの先生は間違っているでしょう(私はまったく驚かないでしょう). ただし、ヒープからメモリを割り当てる場合、割り当てられるメモリ チャンクはおそらく 2 の累乗の倍数になるということは事実です。メモリアロケータ。したがって、数バイトを無駄にしている可能性があります。ただし、多くのオブジェクトがない限り、これらの詳細については気にしません。意味的に正しいアプローチを使用して、最初にプログラムを正しく取得してください。

ただし、これらの問題に対処する最善の方法は、そもそも配列を使用するのではなく、std::vector<T>orを使用することstd::deque<T>です。

于 2013-08-17T01:29:27.990 に答える
1

その先生は本当にファンキーな (そして間違った考えを持っている) 人です。なぜ stuff なのかを説明するために、各ステートメントを確認してみましょう。

... 私たちの C++ の先生は ... もっと効率的にするために、配列のサイズを 4 の倍数にするべきだと言いました... 彼は、この背後にある理由は、コンピューターがメモリ空間を割り当てた方法によるものだと言いました (空間はそうではないかもしれません)正しい作業 - 基本的に配列内の各要素のメモリアドレス)

C (および C++) では、メモリを割り当てると、型に関係なくそこにあることが認められます。そうしないと、実行時エラーが発生します。彼が言ったかもしれないことは、オーバーフローエラーに対応するために、より多くのスペースを割り当てることは良い習慣になる (そうではない) ということです。ただし、C および C++ では、静的 (つまり、これnew()についてはよくわかりませんが、動的に宣言されていないことを意味します) 配列内のすべてのメモリが連続していることを認めています。何かを宣言するときは、使用する必要がある量のメモリ (リソース) のみを使用してください。

コンピューターは、各配列要素のメモリ アドレス/場所を 4 つのグループに割り当てました。そのため、8 つの要素の配列が 2 つのメモリ グループで作成されました (繰り返しますが、グループは正しい単語ではありません)。

Anintは少なくとも 4 バイトです。参照を通じてメモリ内の任意のバイトを参照できるため、環境上の問題が発生しない限り、メモリを 4 つのグループに分割する必要はありません。

これは、他のコンピューター数学(正確に1000ではなく1GB = 1024MBなど)に関してはもっともらしいように思えますが...

これについては別の場所で説明するのが最適ですが、GB と GiB は別のものです。ウィキペディアで見てください。ただし、メモリに関しては、Byte 単位の倍数が 2 10、2 20、2 30などの順になっているという非公式の慣習があります。

最後に、前のコメンターが言ったように、C++ で物事を行う正しい方法std::vector<T>は、最も配列に似たコンテナーである新しいコンテナー クラスを使用することです。この種の配列宣言は、非常に単純なものやレガシー C コードのために残しておいてください。

于 2013-08-17T01:53:52.530 に答える
1

最近、スーパーユーザーを調査しているときに、断片化について説明している投稿に出くわしたため、ウィキペディアのこの投稿にたどり着きました。引用:

たとえば、メモリは 4、8、または 16 で割り切れるチャンクでしかプログラムに提供できず、その結果、プログラムがおそらく 23 バイトを要求した場合、実際には 24 バイトのチャンクを取得します。これが発生すると、余分なメモリは廃棄物。このシナリオでは、使用できないメモリは割り当てられた領域内に含まれているため、内部断片化と呼ばれます。

それでも、ほとんどの人が指摘したように、「節約された」スペースの量はそれほど大きな問題ではありません。ほとんどの最新のシステムには大量のメモリ (GB) が存在するためです。マシンのニーズではなく、プログラムのニーズに従って設計する方がよいでしょう。

于 2013-08-18T20:46:40.033 に答える