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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

3回答

5733閲覧

境界調整について

strike1217

総合スコア651

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2016/06/10 12:19

C言語を勉強しているのですが、境界調整とはなんでしょうか?
アラインメントとも言うんですか??
調べてみたのですが、なんのことだかサッパリわからないです。
それと共用体の使い方を教えてください。
同じメモリ領域が共有されること利点とはなんですか??
どういったときに共用体が使われのでしょうか??
ぜひ教えてください。

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

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

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

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

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

guest

回答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

catsforepaw

総合スコア5938

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

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

strike1217

2016/06/10 13:10

とても詳しく、ありがとうございました。 助かりました。
guest

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
episteme

総合スコア16614

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

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

strike1217

2016/06/10 13:09

ありがとうございます。
guest

0

要は変数のアドレスを「切りのいい位置」に揃えるってことです。
たとえば、
struct foo {
char str[5];
};
struct foo data[10]; なんてとき data[0], data[1],... がすべて4の倍数となるように
struct foo に使われない領域3byteを埋め込むなんてことをコンパイラがやったりします。
それがアラインメント。

投稿2016/06/10 12:34

episteme

総合スコア16614

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

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

strike1217

2016/06/10 13:08

お早い回答ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問