使用std::memmove从联合体的一个成员复制到另一个成员是否合法?
使用std::memmove从联合体的一个成员复制到另一个成员是否合法?
咱们先来聊聊这段代码的背景:它尝试在不违反严格别名规则的前提下,把内存内容重新解释成另一种类型,是针对「使用std::memmove规避严格别名问题?」这个问题给出的一种解决方案,建议先看看该问题下的评论再深入讨论。
#include <cstring> #include <cstdint> #include <iomanip> #include <iostream> struct Parts { std::uint16_t v[2u]; }; static_assert(sizeof (Parts) == sizeof (std::uint32_t)); static_assert(alignof(Parts) <= alignof(std::uint32_t)); int main() { union { std::uint32_t u; Parts p; }; u = 0xdeadbeef; std::clog << std::hex << u << " ~> "; std::memmove(&p, &u, sizeof u); std::clog << p.v[0] << ", " << p.v[1] << '\n'; }
我认为这里的std::memmove()调用是不合法的,因为根据C++标准中关于联合体的通用规则部分……
备注:内容来源于stack exchange,提问作者Toby Speight
相关产品推荐
相关产品推荐

