ページ 1 / 1
構造体のパディングについて
Posted: 2012年10月16日(火) 17:04
by そまし
はじめての投稿です。
構造体のパディングについて教えてください。
32bitプロセッサ(PowerPC)でコンパイラはgccを利用しています。
下記のような構造体を定義した場合、
どのうようなパディングが行われるのでしょうか。
typedef struct {
oper_type_e operation; /* これはenumの型 */
longlong lag_entry;
unsigned long err;
short abc
} entry_data_t;
上から、各メンバのサイズは下記のどちらかになるのでは
ないかと思っておりますが、よく分かりません。。
①
4
8
4
4+(パディング2含む)
②
8+(パディング4含む)
8
8+(パディング4含む)
8+(パディング6含む)
よろしくお願いします。
Re: 構造体のパディングについて
Posted: 2012年10月16日(火) 17:30
by h2so5
アドレスを出力すれば分かりますよ
コード:
#include <stdio.h>
typedef enum {
foo
} oper_type_e;
typedef struct {
oper_type_e operation; /* これはenumの型 */
long long lag_entry;
unsigned long err;
short abc;
} entry_data_t;
int main(void) {
entry_data_t data[4];
printf("%d\n\n", sizeof(entry_data_t));
int i;
for (i = 0; i < 4; i++) {
printf("%x\n", &data[i].operation);
printf("%x\n", &data[i].lag_entry);
printf("%x\n", &data[i].err);
printf("%x\n", &data[i].abc);
printf("\n");
}
return 0;
}
Re: 構造体のパディングについて
Posted: 2012年10月16日(火) 17:39
by box
メンバー abc に関するパディングの状況を正確に知りたい場合、
この後ろに何かダミーのメンバーがあった方がいいような気がします。
h2so5 さんが書きました:
コード:
printf("%x\n", &data[i].operation);
"%x" で本当にいいのかどうかは微妙な気がします。
私だったら、"%p" を使います。
Re: 構造体のパディングについて
Posted: 2012年10月16日(火) 17:46
by h2so5
box さんが書きました:
"%x" で本当にいいのかどうかは微妙な気がします。
私だったら、"%p" を使います。
なるほど、確かに64bit環境では%xだと正しく表示されないようです。
ご指摘ありがとうございます。
コード:
#include <stdio.h>
typedef enum {
foo
} oper_type_e;
typedef struct {
oper_type_e operation; /* これはenumの型 */
long long lag_entry;
unsigned long err;
short abc;
int dummy;
} entry_data_t;
int main(void) {
entry_data_t data[4];
printf("%ld\n\n", sizeof(entry_data_t));
int i;
for (i = 0; i < 4; i++) {
printf("%p\n", &data[i].operation);
printf("%p\n", &data[i].lag_entry);
printf("%p\n", &data[i].err);
printf("%p\n", &data[i].abc);
printf("\n");
}
return 0;
}
[追記]
sizeof(entry_data_t) と合わせれば、ダミーなしでもabcのパディングの状態は分かりそうですが、どうでしょう。
Re: 構造体のパディングについて
Posted: 2012年10月16日(火) 18:28
by そまし
ご回答ありがとうございます。
現状、sizeofを実施した結果としては②で動いていそうなのですが、
32bitプロセッサなのに、本当に8byte刻みになるのか違和感があって質問させていただきました。
各メンバのアドレス表示する方法でも試してみたいと思います。
TPありがとうございました。