Why is a double member in struct not aligned on 8 byte boundary?

前端 未结 3 793
既然无缘
既然无缘 2021-01-13 10:06

This is about memory alignment. In code below, I expected that the offset of b inside the structure to be 8 (32-bit machine). See here. There by, making b alway

3条回答
  •  被撕碎了的回忆
    2021-01-13 10:48

    I expected that the offset of b inside the structure to be 8 (32-bit machine). See here

    Your references explain why it could be advantageous to 8-align doubles. This doesn't amount to a guarantee that doubles will always be 8-aligned. If your sources say that they're always 8-aligned, and you observe an implementation in which they aren't, then your sources are wrong.

    From the GCC man page:

    Aligning "double" variables on a two word boundary will produce code that runs somewhat faster on a Pentium at the expense of more memory.

    So GCC's stated reason for 4-alignment is to save memory. You can use -malign-double and -mno-align-double to control that, although of course you risk creating binary incompatibilities if you share structs between code compiled with conflicting options. For particular objects/struct members you can use GCC's own __attribute__((aligned)), _Alignas (in C11) or alignas (in C++11), all of which can take an integer constant to specify the required alignment.

提交回复
热议问题