当前位置: 首页 > 知识库问答 >
问题:

C11中的并集与严格别名

谷光誉
2023-03-14

假设我有一个这样的工会

union buffer {
  struct { T* data; int count; int capacity; };
  struct { void* data; int count; int  capacity; } __type_erased;
};

如果我在C11别名规则下混合读/写匿名结构成员和__type_erased成员,我会有麻烦吗?

更具体地说,我对独立访问组件时发生的行为感兴趣(例如,通过不同的指针)。举例说明:

grow_buffer(&buffer.__type_erased);
buffer.data[buffer.count] = ...
#define ALLOC_ONE(A)\
    (_array_ensure_size(&A.__type_erased, A.count+1), A.count++)
#define ALLOC_ONE(A) \
   (A.__type_erased = _array_ensure_size(A.__type_erased, A.count+1),\
    A.count++)

共有1个答案

江鸿羲
2023-03-14

C11标准规定如下:

6.5.2.3组织和工会成员

95)如果用于读取联合对象内容的成员与上次用于在对象中存储值的成员不同,则该值的对象表示的适当部分被重新解释为6.2.6中所述的新类型的对象表示(有时称为“类型双关语”的过程)。这可能是一种陷阱表示。

struct t1 { int m; };
struct t2 { int m; };
int f(struct t1 *p1, struct t2 *p2)
{
  if (p1->m < 0)
  p2->m = -p2->m;
  return p1->m;
}
int g()
{
  union {
    struct t1 s1;
    struct t2 s2;
  } u;
  /* ... */
  return f(&u.s1, &u.s2);
}
 类似资料:
  • 我的理解是,由于所谓的“严格混淆现象规则”,以下代码在C中具有未定义的行为。 特别是,C编译器可能会完全忽略赋值,因为它可以假定

  • 我正在阅读关于reinterpret_cast的笔记,它是混淆现象(http://en.cppreference.com/w/cpp/language/reinterpret_cast)。 我写了代码: 我认为这些规则在这里不适用: T2是对象的(可能是cv限定的)动态类型 T2和T1都是指向相同类型T3的指针(可能是多级的,可能在每个级别都是cv限定的)(因为C11) T2是一个聚合类型或并集类

  • 问题内容: 和之间的真正区别是什么?我可以阅读ehcache和Hibernate文档,但据我所知,他们只说“如果进行更新,读写会更好”。我觉得不满意。 我可能对这样配置的长期缓存集合有问题: 更新集合时,发生更新的节点以及其他节点上究竟发生了什么?和这里和有什么不一样?一个节点是否有可能会使用其缓存中的10分钟版本? 请注意冗长的超时和异步复制。 问题答案: 读写:如果两个事务试图修改数据,则这些

  • 基本上,当启用严格别名时,此代码是否合法? 这里,我们通过另一种类型的指针(指向<code>void*</code>的指针)访问一种类型(<code<int*</code>)的对象,因此我认为这确实是一种严格的别名冲突。 但是,试图突出未定义行为的样本使我怀疑(即使它不能证明它是合法的)。 首先,如果我们将<code>int*</code>和<code>char*</code>别名,我们可以根据优

  • 本文向大家介绍Java中传统集合与并行集合之间的区别,包括了Java中传统集合与并行集合之间的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,在Java中,集合是最重要的概念之一,它使Java本身成为一种强大的语言。它仅支持Java中的集合,这使得它可以方便,有效地支持任何类型的数据以及可能对它们进行的CRUD操作。 但是在同一阶段,当集合暴露于多线程环境时,由于某些地方集合缺乏对多线程环

  • 我试图理解C和C的严格别名规则。我已经问了很多关于这个问题的问题,并做了一些阅读,但我只想澄清一些事情。 指向任何类型的指针都可以别名void*,这就是为什么我们可以这样做: 但是: (问题1)任何指针类型都可以别名char指针吗? 问题2:此外,当将任何指针类型别名为char或void指针类型时,我们需要确保正确的对齐方式,对吗?在堆栈上不能保证char或char数组在我们从新或malloc获得

  • ES的几个重要版本 ES5 : 09年发布。 ES6(ES2015) : 2015年发布,也称为ECMA2015。 ES7(ES2016) : 2016年发布,也称为ECMA2016 (变化不大)。 严格模式的理解 概念 理解:除了正常运行模式(混杂模式),ES5添加了第二种运行模式:"严格模式"(strict mode)。 顾名思义,这种模式使得Javascript在更严格的语法条件下运行。 目

  • 问题内容: 我知道这个问题应该在scipy.optimize手册中处理,但是我不太了解。也许你可以帮忙 我有一个函数(这只是一个示例,不是真正的函数,但是我需要在这个级别上理解它): 编辑(更好的示例): 假设我有一个矩阵 具有目标功能 现在,我想假设t [i]是实数,并且类似 问题答案: 这个约束 将是等式()约束,其中您必须创建一个必须等​​于零的函数: 然后,您对约束进行了定义(字典列表(如