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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
そまし

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

#1

投稿記事 by そまし » 13年前

はじめての投稿です。
構造体のパディングについて教えてください。
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含む)

よろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 13年前

アドレスを出力すれば分かりますよ

コード:

#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;
}

box
記事: 2002
登録日時: 15年前

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

#3

投稿記事 by box » 13年前

h2so5 さんが書きました:

コード:

        short abc;
メンバー abc に関するパディングの状況を正確に知りたい場合、
この後ろに何かダミーのメンバーがあった方がいいような気がします。
h2so5 さんが書きました:

コード:

                printf("%x\n", &data[i].operation);
"%x" で本当にいいのかどうかは微妙な気がします。
私だったら、"%p" を使います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#4

投稿記事 by h2so5 » 13年前

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: 構造体のパディングについて

#5

投稿記事 by そまし » 13年前

ご回答ありがとうございます。

現状、sizeofを実施した結果としては②で動いていそうなのですが、
32bitプロセッサなのに、本当に8byte刻みになるのか違和感があって質問させていただきました。
各メンバのアドレス表示する方法でも試してみたいと思います。

TPありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る