![]() |
1
10
对。 提供了一种创建通用容器的方法。但是,要获得多态行为,您必须自己实现vtable或类型切换… 那里 是 但是,其中一个特性只能在需要时使用,而且很少需要。 |
![]() |
2
4
即使
如果你把所有的
|
![]() |
3
3
是的,联合可以是不可移植的和不安全的,但有其用途。例如,它可以通过消除将uint32强制转换为char[4]来加快速度。如果您试图在sw中按IP地址路由,这可能会很方便,但是您的处理器endian必须是网络顺序的。把联管节看作是铸造的一种替代方法,使用更少的机器指令。铸造也有类似的缺点。 |
![]() |
4
3
该问题包含一个约束,该约束可能不允许有效的答案… 您在标准下询问实际使用情况,但是“实际使用”可能允许知识渊博的程序员以标准委员会不希望预期或列举的方式利用实现定义的行为。我的意思并不是说标准委员会有一个特定的行为,但是他们明确地想把能力留在那里,以一种有用的方式加以利用。 换句话说:工会不必 适用于标准定义的行为 一般来说,为了有用,它们可以简单地允许某人利用目标机器的特性,而无需使用汇编。 可以有一百万种有用的方法在各种机器上使用它们,以实现定义的方式使用它们,而没有零种有用的方法以严格可移植的方式使用它们,但是这些百万种实现定义的用法足以使它们的存在标准化。 我希望这是有道理的。 |
![]() |
5
3
即使对已知对齐和打包的特定实现进行折扣,联合仍然是有用的。 它们允许您将多个值中的一个值存储到单个内存块中,并沿以下行存储:
是的,它
是
不可移植,希望能够将数据存储到
换言之:
如果你用的话就可以了
|
![]() |
6
3
以下是工会的一种合法便携式使用:
加上输入信息
此外,虽然它不是“可移植的”,但它假定除了
|
![]() |
7
2
我遇到的一种使用联合的方法是隐藏数据。 假设您有一个结构作为缓冲区 然后,通过在某些模块中的结构上允许union,您可以以不同的方式访问缓冲区的内容,或者根本不访问缓冲区的内容,这取决于在该特定模块中声明的union。 编辑:这里有一个例子
在这里,使用union x y的人可以将x y强制转换为结构x或y 所以给定一个函数:
您可以访问结构X或结构Y 但是你想限制访问,这样用户就不知道X了 联合名称保持不变,但结构X部分不可用(通过标题)
|
![]() |
8
2
使用union进行类型压缩是不可移植的(尽管比任何其他类型压缩方法都不可移植)。 例如,解析器Otoh通常有一个联合来表示表达式中的值。 [编辑:我要用一个更容易理解的解析器示例替换解析器示例]: 让我们考虑一个Windows资源文件。您可以使用它来定义菜单、对话框、图标等资源,如下所示:
解析菜单会给出菜单定义;解析对话框会给出对话框定义等。在解析器中,我们将其表示为一个联合:
然后,我们指定将通过解析特定类型的表达式而生成的类型。例如,文件中的字体定义变为
只是澄清一下,
是的,理论上我们 能够 在这里使用结构而不是联合——但是除了浪费内存之外,它没有任何意义。文件中的字体定义 只有 定义字体。除了它实际定义的字体之外,让它生成一个包含菜单定义、图标定义、数字、字符串等的结构是没有意义的。 [编辑结束] 当然,使用联合来保存内存已经不再重要了。虽然现在它看起来很普通,但在64kb的RAM非常多的时候,内存节省意味着更多。 |
![]() |
9
0
考虑一个具有不同位字段的硬件控制寄存器。通过在寄存器的这些位字段中设置值,我们可以控制寄存器的不同功能。 通过使用union数据类型,我们可以修改寄存器的整个内容或寄存器的特定位字段。 对于EX: 考虑如下联合数据类型:
要修改寄存器的全部内容,
修改单位字段内容(用于ex bitfield3)
两者都反映在同一个记忆中。然后这个值可以写入硬件控制寄存器的值中。 |
![]() |
10
0
下面是一个实际例子: 有一些微控制器,它们的非易失性存储器将数据存储在字节块中。 你怎么能轻易地在记忆中存储一组浮点数呢? 我们知道在C中,浮点数的长度是32位(4字节),因此:
现在,您可以使用float_int8类型的变量/指针存储/地址浮动,并且使用循环,您可以很容易地将它们存储在内存中,作为已分解的字节,而无需进行任何转换或分解。同样的故事在读记忆的时候重复着。即使您不需要知道如何将浮点数分解成字节来存储或恢复存储在内存中的数据。 这个例子摘自我自己的工作。所以是的,它们是有用的。 |
![]() |
afiori · 访问结构并集中结构的第一个字段 7 年前 |
![]() |
AppTest · 如果联合声明为[闭合],则不会显示循环 8 年前 |
![]() |
NeoR · 联合和内存管理[重复] 8 年前 |
![]() |
Kevin · 获取浮点数的符号、尾数和指数 9 年前 |
|
user2671513 · C:指针、并集和地址 11 年前 |
|
user2322888 · 并集在c中有什么用?[副本] 11 年前 |
![]() |
chhenning · 在c中使用并集时不理解输出++ 12 年前 |
|
user978122 · C工会背后的意义是什么? 12 年前 |