C
1char buf[10];
配列の宣言についてなのですが・・・
配列の要素数を2のべき乗にする人がよくいますよね。
この理由は何でしょう?
2, 4, 8, 16, 32, 64, 128 などとやる理由はなんです?
アライメント関係があるのかと思ったのですが、ないような気がしてきました。
分かる方は理由を教えてください。
どのようなメリットがあるのでしょう??
「追記」
asmさんの回答を見て確かに、2,4は見かけないですね。
小さすぎて特に使わないという理由もあるかもしれませんが、もしかしてアセンブリ言語のスタックが32bit(4B)が関係しているんでしょうか??
8, 16, 32, 64, 128 2のべき乗と言うより、4の倍数ですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答7件
0
他回答者の方が仰るように、メモリなど、
パフォーマンス上のメリットは実際には少ないでしょう。
しかし、C言語に限らず、配列に限らず、
何かのデフォルトの数値に、2のべき乗を設定することが、
私はわりとよくあります。デフォルトのデフォルトです。
なぜそうするかというと、1に到達するまで、余りを出さずに、
どこまでも半分半分に分割できることが保証されているから、
多くしたり少なくしたりする操作が容易です。
普通のキリ番、たとえば300だと何が起こるかというと、
300→150→75→? で、もう半分に割りきれません。
とりあえず、37にしましょうか。
しかし、反対に倍に増やしたとき、74になります。
74→148→296となって、単純な操作では元に戻りません。
もちろん、人間が判断するならそれくらい分かりますが、
機械に自動的に増減させるときに、処理が多少面倒です。
「100とか定数を増減させれば?」と思うかもしれませんが、
べき乗は圧倒的にスケールを変える足が速いです。
たとえば、2の20乗でもう約100万まで行きますが、
100を足すのでは1万回掛かります。
「桁数に応じて増減する値を変えて……」
ということもできますが、やっぱり処理が多少面倒です。
話は飛躍しますが、遺伝的アルゴリズムのような探索的な手法を取るときに、
100世代とか1万世代とか反復するので、
こういう細かいところで、意外と結果に差が付く場合があります。
カオスで誤差が増幅するみたいな話です。
結論として、2のべき乗を好むのは、
アルゴリズムによくある、再帰的な発想のひとつです。
投稿2017/11/22 11:32
編集2017/11/22 11:41総合スコア5592
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
昔のアセンブラー上がりのCプログラマーはバッファサイズなどを2のべき乗にする習慣があったのかもしれません。限られたメモリ領域を無駄なく隙間なく埋めるには2のべき乗サイズであると都合が良いですし、メモリレイアウトを考える際もきりの良い数字だと設計しやすいし(昔は方眼紙に書いていた!)、なによりも配列などのアドレス計算がビット演算でできるので少ない命令で高速に処理できます。あるいは、ハード(OS)寄りのCプログラマーも2のべき乗サイズにする習慣があるかもしれません。デバイスとやりとりするバッファサイズが2のべき乗であることが多いからです。
そして、そのような先輩プログラマーを見習った新人プログラマーが、あまり深く考えずになんとなくまねしているうちに2のべき乗サイズにする習慣が付いた、ということもあるかもしれません。
メモリもクロックもメガを通り越してギガに突入している今となっては2のべき乗にこだわるべき理由はないでしょう。ただ、リソースが乏しい小規模な組み込み系(搭載メモリの単位がキロバイトとか)などでは、メモリの効率利用やパフォーマンスのために考慮する価値はあると思います。
投稿2017/11/23 11:56
総合スコア5944
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
現実にはあまりメリットはなく、単にキリが良いからというイメージからではないでしょうか。
とくにヒープの場合ですと、割当するバイト数以外の管理用の領域が必要だったりするので、アライメント上はかえって不利になる可能性さえあります。
投稿2017/11/22 10:02
総合スコア11705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/24 02:59

0
私も気になったので検索してみました。かなり古い回答ですが、「mallocやfreeでのヒープ領域でのフラグメンテーションの発生を抑えるため」という回答があります。自動変数などが割り当てられるスタック領域にはとくにこの2の冪乗の意味はないようですが、おそらくmalloc等で確保したヒープ領域とサイズを合わせる風習があったのではないでしょうか。
http://thesmithfam.org/blog/2005/09/18/power-of-2-array-sizes/
投稿2017/11/22 09:50
総合スコア9210
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
char buf[255]
等とすることはあります。
サイズを1バイトで表現できる0xffとしているためです。
0x100や0x200がきりよく感じられるということもあるかもしれません。
投稿2017/11/22 09:50

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/22 12:22