STINNER Victor <vstin...@python.org> added the comment:
On my x86-64 Fedora 35, gcc says 32 bytes for sizeof(max_align_t). By the way, g++ also says 32 bytes for sizeof(std::max_align_t). GCC 11.2.1 defines max_align_t as: --- #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) \ || (defined(__cplusplus) && __cplusplus >= 201103L) #ifndef _GCC_MAX_ALIGN_T #define _GCC_MAX_ALIGN_T /* Type whose alignment is supported in every context and is at least as great as that of any standard type not using alignment specifiers. */ typedef struct { long long __max_align_ll __attribute__((__aligned__(__alignof__(long long)))); long double __max_align_ld __attribute__((__aligned__(__alignof__(long double)))); /* _Float128 is defined as a basic type, so max_align_t must be sufficiently aligned for it. This code must work in C++, so we use __float128 here; that is only available on some architectures, but only on i386 is extra alignment needed for __float128. */ #ifdef __i386__ __float128 __max_align_f128 __attribute__((__aligned__(__alignof(__float128)))); #endif } max_align_t; #endif #endif /* C11 or C++11. */ --- file: /usr/lib/gcc/x86_64-redhat-linux/11/include/stddef.h It's not an union but a structure with 2 fields (1 long long, 1 long double). The __i386__ macro is not defined on Linux x86-64, so the struct does not have the 3rd 128-bit float field. align.c: --- #include <stddef.h> int main() { return sizeof(max_align_t); } --- Build and run (C): --- $ gcc align.c -o align && (./align; echo $?) 32 --- align.cpp: --- int main() { return sizeof(std::max_align_t); } --- Build and run (C++): --- $ g++ align.cpp -o align && (./align; echo $?) 32 --- ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue47179> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com