问题标签 [unions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
167 浏览

c++ - 联合结构产生垃圾和关于结构命名的一般问题

前几天(今天)我读到了关于工会的文章,并尝试了它们附带的示例函数。很容易,但结果是清晰而彻底的垃圾。

第一个例子是:

其中一个 int 被假定为 32 位。在我设置一个值Test t; t.Int = 7;然后 cout

cout << t.Bytes.byte1 << etc...

单个字节,没有显示任何内容,但我的电脑发出哔哔声。我猜这很奇怪。

第二个例子给了我更糟糕的结果。

在我看来,这看起来有点古怪。无论如何,从它说的描述来看,当我设置值时,这应该会自动以高/小端格式存储结果

Switcher.word = 7656;并打电话给cout << Switcher.data.hi << endl

其结果是甚至没有在 ASCII 图表中定义的符号。不知道为什么会出现这些。

最后,当我尝试纠正示例时出现错误,而不是将 Bytes 放在结构的末尾,而是将其放在它旁边。所以而不是

struct {} Bytes;

我想写

struct Bytes {};

这给了我一个很大的错误。这些有什么区别?由于 C++ 不能有未命名的结构,在当时,很明显,位于开头和结尾的字节就是命名它的东西。除了不,这不是我猜的全部答案。之后怎么样了?

0 投票
4 回答
583 浏览

c - 为什么我的工会没有显示正确的值?

它打印出19969。为什么它不打印出20000?

0 投票
6 回答
399 浏览

c - 寻求 C Union 的清晰性

好的,所以我想我知道如何使用它,(或者,这就是我看到它使用的方式)即。

但我并没有真正了解联合声明了多少存储空间(4 个浮点数?8 个浮点数?12 个浮点数?),怎么样?为什么?还有为什么在使用 FltVector {{}} 时有两组花括号?

为什么要使用工会?为什么不做。。

?

任何指针都非常感谢(对不起双关语)

0 投票
3 回答
7928 浏览

c - 使用联合来简化强制转换

我意识到我正在尝试做的事情并不安全。但我只是在做一些测试和图像处理,所以我的重点是速度。

现在,这段代码为我提供了 32 位像素值类型的相应字节。

我想检查我是否有一个低于某个值的像素(例如r, g, b <= 0x10)。我想我只想用条件测试像素的位和位0x00E0E0E0(我在这里可能有错误的字节序)以获得暗像素。

与其使用这种丑陋的混乱(*((uint32_t*)&pixel))来获得 32 位 unsigned int 值,我认为应该有一种方法可以设置它,这样我就可以使用pixel.i,同时保持使用pixel.g.

我可以这样做吗?这不起作用:

我需要编辑我现有的代码来pixel.p.g获取绿色字节。如果我这样做,也会发生同样的情况:

这也可以,但我仍然需要将所有内容更改为 index c,这有点难看,但如果我真的需要,我可以让它与宏一起使用。

0 投票
3 回答
865 浏览

c++ - 在这个矩阵类中使用联合是完全安全的吗?

工会不是我经常使用的东西,在这里查看了一些关于它们的其他问题之后,似乎几乎总是有某种警告,它们可能不起作用。例如。结构可能具有意外的填充或字节序差异。

在我正在使用的数学库中遇到了这个问题,我想知道它是否完全安全。我假设多维数组没有任何额外的填充,并且由于两个定义的类型相同,它们保证占用完全相同的内存量?

这种设置有什么缺点吗?定义的顺序会对它的工作方式产生什么影响吗?

0 投票
7 回答
16733 浏览

c - gcc、严格混叠和通过联合进行强制转换

你有什么恐怖故事要讲吗?GCC 手册最近添加了关于 -fstrict-aliasing 和通过联合强制转换指针的警告:

[...]获取地址,转换结果指针并取消引用结果具有未定义的行为[强调添加],即使转换使用联合类型,例如:

有没有人有一个例子来说明这种未定义的行为?

请注意,这个问题与 C99 标准所说的或没有说的无关它是关于今天gcc和其他现有编译器的实际功能。

我只是猜测,但一个潜在的问题可能在于设置d为 3.0。因为d它是一个永远不会直接读取的临时变量,也永远不会通过“有点兼容”的指针读取,所以编译器可能不会费心去设置它。然后 f() 将从堆栈中返回一些垃圾。

我简单、天真的尝试失败了。例如:

工作正常,给予CYGWIN:

查看汇编程序,我们看到gcc完全优化t了: f1()简单地存储预先计算的答案:

whilef2()将 3333333.0 推入浮点堆栈,然后提取返回值:

并且这些函数也是内联的(这似乎是一些微妙的严格混叠错误的原因),但这与这里无关。(而且这个汇编器没有那么重要,但它增加了确凿的细节。)

另请注意,获取地址显然是错误的(或正确的,如果您试图说明未定义的行为)。例如,正如我们知道这是错误的:

我们同样知道这是错误的:

有关这方面的背景讨论,请参见例如:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1422.pdf
http://gcc.gnu.org/ml/gcc/2010-01/msg00013.html
http:// davmac.wordpress.com/2010/02/26/c99-revisited/
http://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html(=
在 Google 上搜索页面然后查看缓存页面)

什么是严格的别名规则?
C++ (GCC) 中的 C99 严格别名规则

在第一个链接中,七个月前 ISO 会议的会议记录草稿,一位参与者在第 4.16 节中指出:

有没有人认为规则足够清晰?没有人能够真正解释它们。

其他说明:我的测试是使用 gcc 4.3.4,使用 -O2;选项 -O2 和 -O3 暗示 -fstrict-aliasing。GCC 手册中的示例假定 sizeof(double) >= sizeof(int); 他们是否不平等并不重要。

此外,正如 Mike Acton 在 cellperformace 链接中所指出的,这里的示例生成了-Wstrict-aliasing=2,但不是。 =3warning: dereferencing type-punned pointer might break strict-aliasing rules

0 投票
4 回答
7827 浏览

c++ - 在 C++ 中静态初始化匿名联合

我正在尝试在 Visual Studio 2010 中静态初始化以下结构:

以下是失败的error C2440: 'initializing' : cannot convert from 'Data *' to 'char'

我找到了一些可以正确初始化的方法的参考,但它们都不能在 VS2010 中工作。有任何想法吗?

0 投票
5 回答
27311 浏览

c++ - C++ 联合、结构、成员类型

如果我有一堂课:

联合意味着,在列出的所有值中,它一次只能采用其中一个值?这在访问这些变量方面是如何工作的?我将如何hr直接访问?如果我设置hr,如果我尝试访问会发生什么f

0 投票
4 回答
12475 浏览

c - c 联合和位域

位域可以联合使用吗?

0 投票
2 回答
1659 浏览

c - c struct-embedded union中的成员对齐

我正在修改一些 C 代码,大致如下:

显然,当使用联合的 CharData 成员时,代码会尝试计算结构中感兴趣的字节数。我的问题是,编译器警告联合未命名。所以我把它改成

但是当然我还需要更改最后一行。以下总是会产生与原始结果完全相同的结果吗?

还是有可能,CharData(或 ShortData 或 LongData)不会在联合的开头对齐?

-- 编辑:感谢您的回答。这个问题的答案实际上为我提供了我需要的答案:一个指向联合对象的指针,经过适当转换,指向它的每个成员(或者如果一个成员是位域,则指向它所在的单元),并且反之亦然。.

无论如何,我是否应该为这个问题选择一个答案作为接受的答案?