16

g++ を使用して、パックされたフィールドを含むコードをコンパイルします。ただし、パック フィールドへの参照を返そうとするとエラーが発生します。

例:

struct __attribute__((packed)) Foo {
   int* ptr;
   uint16_t foo;
   int*& getPtr(){
      return ptr;
   }
};

エラーが発生します:

test.cpp:22:14: error: cannot bind packed field ‘((Foo*)this)->Foo::ptr’ to ‘int*&’
   return ptr;

パック フィールドへの参照を返すことができないのはなぜですか?

4

1 に答える 1

4

これをカバーするgcc バグ レポートCannot bindpacked fieldがあり、次のように書かれています。

C++ 仕様 (C++03、セクション 3.9、3.9.1、3.9.2) は、T と「T へのポインター」に実装固有のアライメント要件があることを明確に示しています。「T へのポインター」がある場合は、アライメント要件を満たしていると見なすことができます。C仕様にも同様の言語があると確信しています。

OPの場合、次のコードはアライメント要件に違反する可能性があります

彼らは、属性を使用して独自の整列タイプを定義する回避策を提案してalignmentいますが、機能しているようには見えません。

于 2014-12-15T19:21:42.873 に答える