5 ms·
Use a packed struct (e.g. __attribute__((packed))). You may take a performance hit due to lack of alignment, but that's the judgement call
by amboar 7y ago
Use a packed struct (e.g. __attribute__((packed))). You may take a performance hit due to lack of alignment, but that's the judgement call
- Gibbon1 7y ago> performance hit due to lack of alignment This isn't true of modern processors.
- jzwinck 7y agoSure you get free unaligned access for scalars on x86, but unaligned arrays are still trouble if you use SSE (which basically everyone does).
- klingonopera 7y agoWould this work struct S {char data, char pad0, char pad1, char pad2}; int main() {S dataStruct; printf("%s", dataStruct.data); return 0;} and give me a 4-byte struct or would the compiler optimize it all away and leave me with a 1-byte struct?
- saagarjha 7y agoSince you don't actually access the size of the structure, I see no reason why it matters. Also, FWIW, your code has undefined behavior because you call printf with the wrong type.
- klingonopera 7y agoYes on the UB, I'm passing a "char" into a "char *", sorry about that. I don't pass lone char data that often. Well, I chose this example specifically to ask whether the resulting memory structure, completely independent of calling a sizeof(), would still be as if I were to call a sizeof() (which then I believe would be 4 bytes large) if not accessing the total size of the struct or any of the padding members. It makes a difference in the memory footprint, which can become important, if you're programming a device with just 64-bytes total RAM.
- saagarjha 7y ago__attribute__((packed)) is not part of the standard, and therefore doesn't quite answer the question. I believe the standards-compliant way of doing this is that "you can't".