1
5
好吧,你几乎回答了你的问题:记忆。 在过去,内存相当低,甚至节省几千字节也很有用。
但即使在今天,工会也会发挥作用。例如,如果您想实现某种
这听起来不算多,但假设您想使用一个变量来存储4个字符串(如ID)或4个字节的数字(可能是一些散列,也可能只是一个数字)。
如果你使用经典
虽然可以通过强制转换或子类化联合来实现类似的事情,但这仍然是最简单的方法。 |
2
1
并集的一个用途是让两个变量占据相同的空间,结构中的第二个变量决定要读取的数据类型。 例如,您可以有一个布尔值“isDouble”和一个既有double又有long的并集“doubleOrLong”。如果isDouble==true,则将并集解释为double,否则将其解释为long。 并集的另一个用途是访问不同表示形式的数据类型。例如,如果你知道double是如何在内存中布局的,你可以将double放在并集中,将其作为不同的数据类型访问,如long,直接访问其位、尾数、符号、指数等,并对其进行一些直接操作。 现在你真的不需要这个,因为内存很便宜,但在嵌入式系统中它有它的用途。 |
3
0
Windows API大量使用联合。
LARGE_INTEGER
是这种用法的一个例子。基本上,如果编译器支持64位整数,请使用
|
4
0
这并不是真正的搁置,因为C语言创建于1972年,当时内存是一个真正的问题。 你可以提出这样的论点,即在现代的非嵌入式空间中,你可能一开始就不想使用C作为编程语言。如果您选择了C作为实现的语言选择,那么您希望利用C的优势:它高效、接近金属,从而产生紧凑、快速的二进制文件。 因此,当选择使用C时,您仍然希望利用它的优势,包括内存空间效率。为此,欧盟运作得很好;允许您具有一定程度的类型安全性,同时实现可用的最小内存足迹。 |
5
0
我见过它被使用的一个地方是在末日3/idTech 4 Fast Inverse Square Root 实施 对于那些不熟悉该算法的人来说,它本质上需要将浮点数视为整数。旧版的Quake(及更早版本)代码通过以下方式实现:
此代码采用浮点数字的地址
这样做有两个缺点。一个是复杂的地址、强制转换、取消引用过程迫使
第二个问题是,至少在C++中,做这样的铸造是非常不受欢迎的,即使是在做像这个函数这样相当于巫毒的事情时。我相信还有更令人信服的论点,但我不确定它们是什么:) 因此,在《末日3》中,id在他们的新实现中包含了以下比特(使用了一组不同的比特处理,但有类似的想法):
理论上 ,在SSE2机器上,可以通过单个寄存器进行访问;我不确定在实践中是否有编译器会这样做。在我看来,这仍然比早期《地震》版本中的选角游戏更干净。
1. -忽略“足够高级的编译器”参数 |
Community wiki · C中有哪些耗时的操作? 1 年前 |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |