问题标签 [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.
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++ 不能有未命名的结构,在当时,很明显,位于开头和结尾的字节就是命名它的东西。除了不,这不是我猜的全部答案。之后怎么样了?
c - 为什么我的工会没有显示正确的值?
它打印出19969。为什么它不打印出20000?
c - 寻求 C Union 的清晰性
好的,所以我想我知道如何使用它,(或者,这就是我看到它使用的方式)即。
但我并没有真正了解联合声明了多少存储空间(4 个浮点数?8 个浮点数?12 个浮点数?),怎么样?为什么?还有为什么在使用 FltVector {{}} 时有两组花括号?
为什么要使用工会?为什么不做。。
?
任何指针都非常感谢(对不起双关语)
c - 使用联合来简化强制转换
我意识到我正在尝试做的事情并不安全。但我只是在做一些测试和图像处理,所以我的重点是速度。
现在,这段代码为我提供了 32 位像素值类型的相应字节。
我想检查我是否有一个低于某个值的像素(例如r, g, b <= 0x10
)。我想我只想用条件测试像素的位和位0x00E0E0E0
(我在这里可能有错误的字节序)以获得暗像素。
与其使用这种丑陋的混乱(*((uint32_t*)&pixel))
来获得 32 位 unsigned int 值,我认为应该有一种方法可以设置它,这样我就可以使用pixel.i
,同时保持使用pixel.g
.
我可以这样做吗?这不起作用:
我需要编辑我现有的代码来pixel.p.g
获取绿色字节。如果我这样做,也会发生同样的情况:
这也可以,但我仍然需要将所有内容更改为 index c
,这有点难看,但如果我真的需要,我可以让它与宏一起使用。
c++ - 在这个矩阵类中使用联合是完全安全的吗?
工会不是我经常使用的东西,在这里查看了一些关于它们的其他问题之后,似乎几乎总是有某种警告,它们可能不起作用。例如。结构可能具有意外的填充或字节序差异。
在我正在使用的数学库中遇到了这个问题,我想知道它是否完全安全。我假设多维数组没有任何额外的填充,并且由于两个定义的类型相同,它们保证占用完全相同的内存量?
这种设置有什么缺点吗?定义的顺序会对它的工作方式产生什么影响吗?
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
,但不是。 =3
warning: dereferencing type-punned pointer might break strict-aliasing rules
c++ - 在 C++ 中静态初始化匿名联合
我正在尝试在 Visual Studio 2010 中静态初始化以下结构:
以下是失败的error C2440: 'initializing' : cannot convert from 'Data *' to 'char'
。
我找到了一些可以正确初始化的方法的参考,但它们都不能在 VS2010 中工作。有任何想法吗?
c++ - C++ 联合、结构、成员类型
如果我有一堂课:
联合意味着,在列出的所有值中,它一次只能采用其中一个值?这在访问这些变量方面是如何工作的?我将如何hr
直接访问?如果我设置hr
,如果我尝试访问会发生什么f
?
c - c 联合和位域
位域可以联合使用吗?
c - c struct-embedded union中的成员对齐
我正在修改一些 C 代码,大致如下:
显然,当使用联合的 CharData 成员时,代码会尝试计算结构中感兴趣的字节数。我的问题是,编译器警告联合未命名。所以我把它改成
但是当然我还需要更改最后一行。以下总是会产生与原始结果完全相同的结果吗?
还是有可能,CharData(或 ShortData 或 LongData)不会在联合的开头对齐?
-- 编辑:感谢您的回答。这个问题的答案实际上为我提供了我需要的答案:一个指向联合对象的指针,经过适当转换,指向它的每个成员(或者如果一个成员是位域,则指向它所在的单元),并且反之亦然。.
无论如何,我是否应该为这个问题选择一个答案作为接受的答案?