5

構造体の属性はC++で継承されていますか

例えば:

struct A {
    int a;
    int b;
}__attribute__((__packed__));

struct B : A {
    list<int> l;
};

構造体B(構造体A)の継承された部分はpacked属性を継承しますか?

コンパイラの警告が表示されない限り、構造体Bに属性((packed ))を追加することはできません。

ignoring packed attribute because of unpacked non-POD field

したがって、構造体B全体がパックされないことはわかっています。これは私のユースケースでは問題ありませんが、構造体Aのフィールドを構造体Bにパックする必要があります。

4

2 に答える 2

4

構造体B(構造体A)の継承された部分はpacked属性を継承しますか?

はい。継承された部分は引き続きパックされます。ただし、pack属性自体は継承されません。

#include <stdio.h>

#include <list>
using std::list;

struct A {
    char a;
    unsigned short b;
}__attribute__((__packed__));

struct B : A {
    unsigned short d;
};

struct C : A {
    unsigned short d;
}__attribute__((__packed__));

int main() {
   printf("sizeof(B): %lu\n", sizeof(B));
   printf("sizeof(C): %lu\n", sizeof(C));

   return 0;
}

呼ばれると、私は得る

sizeof(B): 6
sizeof(C): 5

あなたの警告は、非PODタイプであり、それ自体がパックされていないlist<>メンバーから来ていると思います。C ++のPODタイプとは何ですか?も参照してください。

于 2012-09-21T13:07:06.677 に答える
4

はい、のメンバーはAに詰め込まれstruct Bます。それはこのようでなければなりません、さもなければそれは継承の全体のポイントを壊してしまいます。例えば:

std::vector<A*> va;
A a;
B b;
va.push_back(&a);
vb.push_back(&b);

// loop through va and operate on the elements. All elements must have the same type and behave like pointers to A.
于 2012-09-21T13:08:29.840 に答える