C++ 试图标准化C+中的may_别名习惯用法+;?

C++ 试图标准化C+中的may_别名习惯用法+;?,c++,unions,strict-aliasing,C++,Unions,Strict Aliasing,据我所知,GCC和Clang都支持:\uuuuu属性(may\u别名)) 因此,我相信,例如,如果我想为一个128位SSE类型定义一个回退类型,该类型在x64/ARM上跨GCC/Clang/MSVC工作,我可以执行以下操作: #ifdef _MSC_VER #define UNIONALIAS union #else #define UNIONALIAS union __attribute__((may_alias)) #endif UNIONALIAS VI128 { uint64

据我所知,GCC和Clang都支持:
\uuuuu属性(may\u别名))

因此,我相信,例如,如果我想为一个128位SSE类型定义一个回退类型,该类型在x64/ARM上跨GCC/Clang/MSVC工作,我可以执行以下操作:

#ifdef _MSC_VER
#define UNIONALIAS union
#else
#define UNIONALIAS union __attribute__((may_alias))
#endif


UNIONALIAS VI128
{
    uint64_t uint64[2];
    uint32_t uint32[4];
    uint16_t uint16[8];
    uint8_t uint8[16];
    int64_t int64[2];
    int32_t int32[4];
    int16_t int16[8];
    int8_t int8[16];
};
现在,据我所知,目前所有版本的MSVC都允许您通过未定义的行为来忽略严格的别名规则,并访问该联盟中的不同类型,并获得您希望的“尽管C++标准没有提供保证”。这些编译器虽然不是标准C++,但是

我怀疑,如果这样的东西成为标准的习惯用法,那么未来版本的MSVC肯定会考虑到这一点,即使他们没有采用兼容的属性语法——也许他们已经计划好了什么?另外,如果将来直接添加对<代码> MyayAias < /C> > /P>的支持,任何未来的C++标准也将有空间来允许一个合适的转换。 我使用一个备用SSE类型作为示例,但可能整数AVX2-1会更好。但问题仍然是,有时您确实想做这样的事情,
memcpy
路由可能由于调试构建中的性能而不可行,有时它可能会导致大量的过度键入和扭曲工作


除了非标准(!)之外,这种方法是否存在任何重大缺陷,或者我对当前编译器行为的理解与此相关?

我的意思是,通过UB,它允许您写入一个字段,并读取另一个字段的别名。从我在网上找到的和看到的情况来看,MSVC的行为是这样的,否则它会破坏很多Win32代码。在中,我在列表中找不到
may\u alias
。我只能在相应的目录中找到它。你确定Clang也支持它吗?