我正在阅读O'Reilly的Practical C Programming一书,并阅读了关于C编程语言的K&R书籍,而且我在掌握工会背后的概念时遇到了麻烦.
它们采用最大数据类型的大小来构建它们......最近分配的数据会覆盖其余数据......但为什么不根据需要使用/释放内存?
这本书提到它用于通信,你需要设置相同大小的标志; 并且在google网站上,它可以消除奇数大小的内存块......但它是否适用于现代的非嵌入式内存空间?
你可以用它和CPU寄存器做些狡猾的事吗?它只是一个早期编程时代的延续吗?或者它是否像臭名昭着的goto一样,仍然有一些强大的用途(可能在紧凑的内存空间中),这使它值得保持?
好吧,你几乎回答了你的问题:记忆.在这些日子里,内存相当低,即使节省几千字节也很有用.
但即便在今天,工会也会有用.例如,如果您想实现某种variant数据类型.最好的方法是使用联合.
这听起来不是很多,但我们假设你想要使用一个存储4个字符的字符串(如ID)或4个字节的数字(可能是某个哈希值或实际上只是一个数字)的变量.
如果你使用经典struct,这将是8字节长(至少,如果你不幸,也有填充字节).使用union它只有4个字节.所以你节省了50%的内存,这对于一个实例来说并不是很多,但想象一下有一百万个内存.
虽然你可以通过转换或子类化来实现类似的东西,但联合仍然是最简单的方法.