News for hackers. Stuff that matters.
Re:The Lost Art of Structure Packing (2018) by elteto on Monday April 27, 2020 @09:58AM (#22995859)
Wait, forgive my ignorance, isn’t this the default? If you don’t care about the memory layout then won’t the compiler reorg / pad structure members to fulfill alignment?
Re:The Lost Art of Structure Packing (2018) by flohofwoe on Monday April 27, 2020 @10:14AM (#22995995)
Nope, C and C++ compilers are not allowed to reorder struct fields (AFAIK at least, I haven't seen this yet in any real world compiler), but they will add padding bytes for natural alignment (and that's where the "waste" is coming from).

IMHO there are just as many arguments for automatic reordering as there are against it (e.g. creating structs that are layed over memory mapped IO registers, or just optimizing a struct for certain cache-efficient access patterns). In my opinion it's sufficient to know about the existance of alignment-padding, and how to work around it if needed (for instance reordering the struct members manually, or using #pragma pack)

Re:The Lost Art of Structure Packing (2018) by TorKlingberg on Monday April 27, 2020 @11:15AM (#22996606)
Yes, the C and C++ standards could have allowed the compiler to reorder structs, but that would have lead to even more of those undefined behavior situation that people complain so much about.

People do quite often rely on the first struct element being at the start of the struct. Memcpy:ing directly between structs and network/disk is also common, but naughty. Both struct padding and endianness already break that.

Re:The Lost Art of Structure Packing (2018) by Chabsff on Monday April 27, 2020 @10:07AM (#22995937)
The rule needs to be deterministic accross compilers, since a library can be compiled using a compiler and linked in an executable using the same header.
Re:The Lost Art of Structure Packing (2018) by SlowRobotAhead on Monday April 27, 2020 @05:33PM (#23000346)
A practical reason you can’t just allow the compiler to do it is if you are doing goofy things like overlaying two structures, void pointer manipulation or casting one object to the format of another because you know the first n number of elements line up anyhow, or if you’re changing specific bytes as memory manipulation and not by the object itself.

Typically if I define a 8bit as the first element, I need to be certain those 8bits are first even if that wastes three more bytes to align on the next variable.

Re:The Lost Art of Structure Packing (2018) by steerablesafe on Monday April 27, 2020 @10:34AM (#22996180)
Unfortunately pointer comparison between addresses of subobjects has a defined order, so reorg is not possible.
Re:The Lost Art of Structure Packing (2018) by virgilp on Monday April 27, 2020 @10:05AM (#22995915)
Pad - yes, typically. Reorg - seldom.
Re:The Lost Art of Structure Packing (2018) by klodolph on Monday April 27, 2020 @10:33AM (#22996169)
Reorg is prohibited by C standard.
Re:The Lost Art of Structure Packing (2018) by gpderetta on Monday April 27, 2020 @03:05PM (#22998851)
It is complicated. Because of the as-if rule, a compiler can do anything it wants as long as a conforming program can't tell the difference. So for example if a compiler can prove that a program doesn't compare fiel addresses, doesn't cast pointer to a struct to its first member, etc it can reorder as it pleases. Turns out it is very hard to prove, often requires whole program optimization and the gains are questionable, so it is seldom done. Both clang and gcc had such an optimization pass in the past but it got dropped.
Re:The Lost Art of Structure Packing (2018) by virgilp on Monday April 27, 2020 @01:06PM (#22997688)
I know, it wasn't obvious to me that elteto talked exclusively about C/C++. AFAIK few -if any- compilers/VMs take it upon themselves to reorder struct members (even outside C/C++ world).
Re:The Lost Art of Structure Packing (2018) by saagarjha on Tuesday April 28, 2020 @01:23AM (#23003679)
Both Swift and Rust have an unspecified structure ordering by default, which almost always boils down to "the compiler will lay them out in the order specified, except if you leave enough padding to fit a member, in which case it'll reorder the elements for you".
Re:The Lost Art of Structure Packing (2018) by leni536 on Monday April 27, 2020 @01:25PM (#22997876)
Even though struct member reordering is prohibited, the order of std::tuple elements are not fixed by the standard. There could be an stdlib implementation that used this fact to reorder tuple members optimally.

AFAIK there are PoC 3rd party implementations for such tuples.

Re:The Lost Art of Structure Packing (2018) by elteto on Monday April 27, 2020 @10:19AM (#22996042)
I see, thanks all.