http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56394
Maxim Yegorushkin <maxim.yegorushkin at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |UNCONFIRMED Resolution|INVALID | --- Comment #3 from Maxim Yegorushkin <maxim.yegorushkin at gmail dot com> 2013-02-19 14:20:44 UTC --- I can reproduce this without __attribute__((packed)) actually: $ cat test.cc #include <cstdio> #include <cstdint> struct Xyz { uint32_t seq_no; uint32_t end_offset_lo, end_offset_hi; }; struct Mapping { void* mem; size_t len; template<class T> T* begin() { return static_cast<T*>(mem); } template<class T> T* end() { auto e = reinterpret_cast<uintptr_t>(static_cast<char*>(mem) + len); return reinterpret_cast<T*>(e - e % sizeof(T)); } }; int main() { Mapping m{reinterpret_cast<void*>(0x40000u), 0x1000u}; Xyz* beg = m.begin<Xyz>(); Xyz* end = m.end<Xyz>(); size_t len = end - beg; printf("beg = %p\n", beg); printf("end = %p\n", end); printf("end - beg = %zx\n", len); printf("sizeof(Xyz) == %zu\n", sizeof(Xyz)); } $ g++ -o test -std=gnu++11 -Wall -Wextra test.cc $ ./test beg = 0x40000 end = 0x40ff8 end - beg = 55555555555556aa <---- wrong sizeof(Xyz) == 12 $ g++ -o test -std=gnu++11 -Wall -Wextra -O test.cc $ ./test beg = 0x40000 end = 0x40ff8 end - beg = 154 <---- correct sizeof(Xyz) == 12