代码之家  ›  专栏  ›  技术社区  ›  Ajay Brahmakshatriya

在类型之间按字节复制数据是否会打破严格的别名?

  •  10
  • Ajay Brahmakshatriya  · 技术社区  · 7 年前

    A B 大小相同,我有两个变量

    A a = ... ; // Initialized to some constant of type A
    B b;
    

    如果我复制 a b 使用类似-

    assert(sizeof(A) == sizeof(B));
    size_t t;
    for( t=0; t < sizeof(A); t++){
        ((char*)&b)[t] = ((char*)&a)[t];
    }
    

    这是否违反了C的严格别名规则? char* 阅读它不是UB,但我关心的是作业中涉及的两个方面。

    如果这不是UB,这是一种有效的类型双关吗?

    2 回复  |  直到 7 年前
        1
  •  5
  •   user2371524 user2371524    7 年前

    此代码不违反别名规则。根据最新草案(n1570),§6.5第7节:

    对象的存储值只能由具有以下之一的左值表达式访问:

    与对象的有效类型兼容的类型的限定版本,
    一种类型,它是与有效类型相对应的有符号或无符号类型
    一种类型,它是与的限定版本相对应的有符号或无符号类型 物体的有效类型,
    一种聚合或联合类型,其中包括上述类型之一 成员(递归地包括子集合或包含的联合的成员),或
    字符类型

    我对这项任务中涉及的两项限制感到担忧。

    这些解引用 访问存储值 使用 字符类型

    当然,你仍然可以触发 未定义的行为 A B .

        2
  •  1
  •   supercat    7 年前

    在目标具有声明类型的情况下,没有问题,但在目标仅通过指针已知的情况下,标准是不明确的。根据写得非常糟糕的6.5p6,使用 memcpy memmove ,或“作为字符类型的数组”[无论这意味着什么]将导致源的有效类型应用于目标。该标准没有规定在不将操作视为复制“字符类型数组”的情况下复制字节序列必须执行的操作。