
構造体のアライメント調整について教えて下さい。
(1)
アライメント調整を行う目的は何ですか?
(2)
char = 1byte short = 2byte int = 4byteの時、
下の構造体にアライメント調整を行うとすれば、どうすればいいでしょうか?
typedef struct{
____char hoge1
____char hoge2
____short hoge3
____char hoge4
____int hoge5
____int hoge6
____char hoge7
}tHOGEHOGE
下の形になるかなぁと思っているのですが、本当に(1)~(4)まで全部必要でしょうか?
typedef struct{
____char hoge1
____char hoge2
(1)__char reserve[2]
____short hoge3
(2)__char reserve[2]
____char hoge4
(3)__char reserve[3]
____int hoge5
____int hoge6
____char hoge7
(4)__char reserve[3]
}tHOGEHOGE
つまらない質問で申し訳ありませんが、
よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
struct s_t {
short s1;
long l1;
short s2;
short s3;
long l2;
};
のように定義した構造体のメモリ上のレイアウトが、ある環境Aでは
Offset
0x00: short s1
0x02: long l1
0x06: short s2
0x08: short s3
0x0a: long l2
のようになり、別のある環境Bでは
Offset
0x00: short s1
0x02: short padding
0x04: long l1
0x08: short s2
0x0a: short s3
0x0c: long l2
のようになるのだとすれば、環境Aと環境Bで同じレイアウトになる構造体は
struct s_t {
short s1;
short reserved1;
long l1;
short s2;
short s3;
long l2;
};
のようにすればよいことになります。
この例のように、「ある環境Aではこう、別のある環境Bではこう」と説明してもらわなければ、「それならこう変えればよい」という結論を得ることはできません。

No.4
- 回答日時:
どのマシンにも通用する最大公約数的なアライメントであれば、以下の規則が全て満足できるものです。
1.構造体のサイズは、そのメンバの最大の型のサイズの整数倍であること。
例:int(4バイト)が最大の型なら、4の倍数であること。同様に、double(8バイト)が最大の型なら、8の倍数であること。
2.各メンバの構造体の先頭からの相対位置は、そのメンバのサイズの整数倍であること。
例:int型であれば、0,4,8,12,・・・バイト目に存在すること。double型であれば、0,8,16,24、・・・バイト目に存在すること。
上記の、2つが、成立すれば、問題ありません。
No.3
- 回答日時:
環境が異なる場合にはアラインメントの他にエンディアンの問題もあります. 現在ではほとんどのプロセッサがビッグエンディアンかリトルエンディアン (またはその両方) なんですが, どっちともいいがたいものもあります.
で, アラインメントとかエンディアンとかを考えなきゃいけないのはなぜかというと, そもそも short とか int とかが混在しているのが原因だったりします. ということで, いっそのこと「(unsigned) char の配列として定義しておき, 必要なときに適宜切り分ける」のがベストかも....
No.1
- 回答日時:
(1) 次のような目的が考えられます。
(他にもあるかもしれません。)・同一のソースプログラムを使ってもコンパイラやコンパイルオプションによって構造体のアラインメントが異なっている場合があるので、その調整のため。
・構造体の中のデータの位置によってプログラムの実行速度が異なる場合があるので、その調整のため。
逆に言えば、単一のプログラム(あるいは単一の環境)のみで処理が完結する場合はアラインメント調整は必要ありません。
(2) アラインメント調整を行わなければならない理由がなければ、行う必要はありません。行う必要がある場合は、その必要性に応じた位置で調整する必要があります。
何のために行うのかが分からないと、どこを調整してよいのかは分かりません。
この回答への補足
また、説明不足で申し訳ありません。
目的は教えて頂いた1つ目です。
>・同一のソースプログラムを使ってもコンパイラやコンパイルオプションによって構造体のアラインメントが異なっている場合があるので、その調整のため。
この目的の場合についてご教授下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 共用体について コマンド...
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
C言語のfor文です。 繰り返しの...
-
c言語の問題の説明、各所ごとに
-
getchar()を int でとる理由...
-
C言語の入力した文字を反転させ...
-
const char** p;のとき、free(p...
-
ソケット通信で大容量のメール...
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
簡単な電卓プログラムについて
-
間接参照のレベルが異なっています
-
PostgresSQLから得たデータが画...
-
【C言語】テキストファイル内の...
-
switch文で文字を比較すること...
-
テキストデータをそのままバイ...
-
数字文字の出現回数を表示する...
-
-'0'の意味について
-
C#からC言語で作成したDLLに文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
間接参照のレベルが異なっています
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
テキストデータをそのままバイ...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
charでの計算?
-
配列をnビットシフトする
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
c言語でユーザ関数を利用して入...
-
干支のプログラム
-
switch文で文字を比較すること...
-
char型からのバイト数取得
-
ネットワークにつながっている...
-
getchar()を int でとる理由...
-
間接操作のレベルとは
-
str系関数を使わずに二つの文字...
おすすめ情報