On Sun, 27 Oct 2024, Thorsten Glaser wrote: > Finn Thain dixit: > > >That would mean __alignof__(foo.b) == sizeof(foo.b) but that's not the > >case on my Linux/i686 system. 4 != 8: > > > >struct baa { > > int a; > > long long b; > >} foo; > > That struct is just 12 bytes for you then? >
Right. i686 and m68k agree on that. > That’s possible on i386 but almost nowhere else, and has multiple > penalties on i386 even (cacheline split, loss of atomicity, merging > of accesses, possible cross-page split, …). > Well, the GCC manual says the Power architecture also has ABI variants with differing alignment rules. https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/RS_002f6000-and-PowerPC-Options.html#index-malign-natural https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/x86-Options.html#index-malign-data-1 https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/x86-Options.html#index-malign-double > Of course, in this case, the software author ought to have made the > padding explicit or, better, sorted the struct members. But if all did > that we wouldn’t have this problem. > Right. And I don't think the problem is going to go away. One solution that is sometimes raised is better tooling. I'm not sure how that would work. Perhaps a better solution would be language changes to allow a struct definition to be qualified with an explicit data model. > >> More importantly, and relevant for Qt, struct baa is also 8-byte > >> aligned... > > > >If the struct itself is not naturally aligned, it too will eventually > >break someone's assumption of natural alignment. > > No, structs are not naturally aligned but aligned to the max() of the > alignment of its members. Natural alignment is only applied to primitive > types. > Makes sense.