ページ 11

構造体のパディングについて

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
h2so5 さんが書きました:

コード:

        short abc;
メンバー 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ありがとうございました。