You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 14:59:37