C言語を勉強しているのですが、境界調整とはなんでしょうか?
アラインメントとも言うんですか??
調べてみたのですが、なんのことだかサッパリわからないです。
それと共用体の使い方を教えてください。
同じメモリ領域が共有されること利点とはなんですか??
どういったときに共用体が使われのでしょうか??
ぜひ教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
境界調整とはなんでしょうか?
アラインメントとも言います。というか、むしろアラインメントと言うことの方が多いです。
変数をメモリに配置する際に、そのデータ型のサイズに合わせてアドレスを調整することを言います。
例えば、short型(2バイト)の変数は、2で割り切れるアドレスに配置され、int型(4バイト)の変数は4で割り切れるアドレスに配置されます。それぞれ2バイト境界、4バイト境界と言います。
では、double型(8バイト)はどうかというと、処理系によっては4バイト境界で配置されたり8バイト境界で配置されたりします。
境界をどこに調整するかは処理系(主にCPUの都合)によって異なり、32bit CPUなら4バイト境界、64bit CPUなら8バイト境界が多いです。
なぜそうするのかというと、ほとんどの場合、境界をまたがるように配置されると、データアクセスのパフォーマンスが低下するからです。CPUによってはアクセスに制限がかかったりすることもあります。
コンパイラーは境界調整のために場合によっては変数と変数の間に余分な領域を確保して、境界を合わせるようにします。その余分な領域のことをパディング(padding)と呼びます。
同じメモリ領域が共有されること利点とはなんですか??
どういったときに共用体が使われのでしょうか??
これはかなりテクニック的な質問になるので、説明するのは難しいです。究極的には、あるときはshortとしてアクセスし、別のときはintとしてアクセスしたい、ということなのですが、パフォーマンス向上が目的だったり、消費メモリの節約が目的だったり、いろいろです。
投稿2016/06/10 13:06
総合スコア5944
0
共用体を何に使うんだか想像がつかないなら、使わなずに済ませたほうが幸せになれます。
相当マシン寄りの凝ったコードには必要となるでしょうが。
union foo {
long long_val;
char char_val[4];
};
union foo data; data.long_val = 12345;
char b = data.char_val[2]; /* 12345 の 2byte目を取り出す */
投稿2016/06/10 12:42
編集2016/06/10 12:48総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
要は変数のアドレスを「切りのいい位置」に揃えるってことです。
たとえば、
struct foo {
char str[5];
};
struct foo data[10]; なんてとき data[0], data[1],... がすべて4の倍数となるように
struct foo に使われない領域3byteを埋め込むなんてことをコンパイラがやったりします。
それがアラインメント。
投稿2016/06/10 12:34
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/10 13:10