在 2020/11/1 10:31, JonY via Mingw-w64-public 写道:
> 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. */
> +/* compiler probably knows __float128 if __SIZEOF_FLOAT128__ is defined */
> +#if defined(__i386__) && defined (__SIZEOF_FLOAT128__)
> + __float128 __max_align_f128
> __attribute__((__aligned__(__alignof(__float128))));
> +#endif
> } max_align_t;This is not correct AFAICT. I will attach some direct quotes from the C17 standard draft [1] [2] below, which is shared between C and C++. In the case of C++ there are some library functions which take `alignof(std::max_align_t)` as default arguments which would introduce even more incompatibility. [1] http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2176.pdf [2] https://files.lhmouse.com/standards/ISO%20C%20N2176.pdf > 7.22.3 Memory management functions > 1 The order and contiguity of storage allocated by successive calls to the > aligned_alloc, calloc, > malloc, and realloc functions is unspecified. The pointer returned if the > allocation succeeds is > suitably aligned so that it may be assigned to a pointer to any type of > object with a fundamental > alignment requirement and then used to access such an object or an array of > such objects in the space > allocated (until the space is explicitly deallocated). This paragraph requires that a non-null return value of `malloc()` shall be aligned to at least 'fundamental alignment'. With 32-bit MSVCRT this value is `8` i.e. `2 * sizeof(void*)`. > 6.2.8 Alignment of objects > 2 A fundamental alignment is a valid alignment less than or equal to _Alignof > (max_align_t). Your patch increases `_Alignof(max_align_t)` to `16`, so `16` (if it is valid anyway; I don't see why it shouldn't be) is a 'fundamental alignment'. But the `malloc()` function cannot guarantee such alignment, so it is not correct to do so. > 3 An extended alignment is represented by an alignment greater than _Alignof > (max_align_t). It is > implementation-defined whether any extended alignments are supported and the > storage durations > for which they are supported. On the other hand, `__float128` may exist on 32-bit Windows with an 'extended alignment'. Extended alignments have stricter requirements basing on their the storage durations. E.g. a `static`, `_Thread_local` or automatic object may be supported, but `malloc()`'d memory may not. Anyway there is no need to increase `_Alignof(max_align_t)`. -- Best regards, LH_Mouse
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Mingw-w64-public mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
