Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't I return a reference to a packed field?

I use g++ to compile code with packed fields. However, I receive an error when trying to return a reference to a packed field.

Example:

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

yields error:

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

Why can't I return a reference to a packed field?

like image 216
gexicide Avatar asked Dec 15 '14 19:12

gexicide


1 Answers

There is a gcc bug report Cannot bind packed field that covers this and it says:

The C++ spec (C++03, Sects. 3.9, 3.9.1, 3.9.2) are very clear that T and "pointer to T" have implementation-specific alignment requirements. If you have a "pointer to T" then you may assume that it meets the alignment requirements. I'm sure the C spec has similar language.

In the OP's case, the following code could violate the alignment requirements

They suggest a workaround using alignment attribute to define your own aligned type but it does not look like it works.

like image 103
Shafik Yaghmour Avatar answered Nov 01 '22 08:11

Shafik Yaghmour