Re: 構造体のメンバの記憶域の順
新城@筑波大学情報です。こんにちは。
In article <871xve8046.wl@anago2.mas.chi.its.hiroshima-cu.ac.jp>
Fujii Hironori <fujii@chi.its.hiroshima-cu.ac.jp> writes:
> 構造体のメンバの記憶域は並べられた順に割り当てらることとなっていますが、
> これには何か理由がありますか。
はい。ハードウェアのレジスタを叩く時に、書いた通りの順番でな
いと困るからです。C言語はOSのカーネルを記述するために作ら
れた言語なので。
> struct foo {
> char a;
> int b;
> char c;
> };
> このとき、並べられた順に a,b,c で割り当てるより、
> a,c,b とした方がたいてい詰め物が少ないと思うので。
結局、入れ替え可能だった場合は、プログラマに入れ替えてもらえ
ばいいというのが、C言語の思想です。
In article <squ7k56vv9z.fsf@stellar.co.jp>
manmos@stellar.co.jp (Hideo "Sir MaNMOS" Morishita) writes:
> > このとき、並べられた順に a,b,c で割り当てるより、
> > a,c,b とした方がたいてい詰め物が少ないと思うので。
> ならびが保証されていないと、むっちゃ困りますけど、理解できません?
別に、「むちゃくちゃ」は、困らないんじゃないかなあ。せっかく
よい質問をしてくれているのに。なにもそこまで言わなくても。
手で順序を入れ替えて、ソースを再コンパイルして動くようなプロ
グラムの場合、コンパイラで自動的に入れ替えても結論は同じです。
そんなプログラムを書いている限りは、困ることはありません。
今となっては、標準でコンパイラに構造体の順番の入れ替えを許す
ことにした方が、最適化が効いていいんでしょうね。キャッシュの
関係で、順番を入れ替えたり、意図的に穴をあけたりすると、プロ
グラムが速くなることがあります。この手の最適化は、CPUに依
存するので、本来はプログラマがやる仕事ではありません。コンパ
イラの仕事です。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735