je le code suivant:taille struct Bitfield différente entre gcc et MSFT CL
#include <cstdint>
#pragma pack(1)
using MyType_t = union {
uint8_t buffer[16];
struct {
uint64_t a : 55;
uint64_t b : 24;
uint64_t c : 1;
uint64_t d : 48;
}fields;
};
#pragma pack()
int main()
{
return sizeof(MyType_t);
}
Je reçois un résultat différent entre gcc \ clang et Visual C++ (Microsoft CL), quand je compare le code assembleur dans le compilateur Explorer et je suis le suivant:
bruit (std = C++ 11 -O3)
main: # @main
mov eax, 16
ret
x86-64 gcc 6.3 (O3)
main:
mov eax, 16
ret
x86-64 CL 19 2017 RTW (Ox)
main PROC
mov eax, 24
ret 0
main ENDP
est-il Visual C++ bogue du compilateur ou il est un comportement indéfini ?
Presque tout avec bitfeilds est un comportement défini par l'implémentation. Très probablement ce que vous voyez est que gcc/clang est intelligent et optimise les 4 champs en 2 'uint64_t's où msvs en ajoute un de plus donc vous n'avez pas un bitfiled qui s'étend sur deux' uint64_t's – NathanOliver