我最近写了一些代码,它使用相同的unsigned short来存储两个值,一个结果和一个id,例如:
unsigned short data = new_id();
// result is either 0 or 1 so store it in the rightmost bit and move the id left
data = (data << 1) + get_result();
// ... later ...
// now we can print results like
printf("%u: %u\n", data & 1, data >> 1);
仅仅使用结构来保存这两个值还是更好?这种类型的东西是常见/可接受的吗?该程序已经存储了如此多的内存,我以为我开始想方设法减少它耗尽的内存。
答案 0 :(得分:13)
Bitfields(但只有当你真的需要紧张空间 - 即嵌入式系统时)?
typedef struct id_result {
unsigned int id : 15;
unsigned int result : 1;
} id_result;
否则,是的,使用具有更完整和有意义定义的结构:
typedef uint16 IDTYPE; /* assuming uint16 exists elsewhere */
typedef struct id_result {
IDTYPE id;
bool result;
} id_result;
答案 1 :(得分:7)
除非记忆非常紧张,否则我会选择结构路线。对于必须维护代码的下一个人来说,这样更清晰,更容易。
我想起M68000有32位地址寄存器的时间,但实际上只使用了24位地址寄存器。程序员做了各种“优化”来将信息存储在其他8位中。当芯片的后期版本(如M68030)使用全部32位时,男孩脸色都是红色的。
答案 2 :(得分:2)
除非存在绝对的内存,否则我宁愿选择具有两个不同变量的结构的简单方法。它增加了可读性并减少了维护工作。
答案 3 :(得分:2)
如果这只是为了减少内存使用量,那么我相信你不应该这样做。最好使用带有2个短路的结构,这使代码更具可读性。与通过使代码更易于维护所获得的好处相比,通过这样做而节省的内存量非常小。
我建议您首先对系统进行概要分析,以确定是否存在任何内存泄漏,或者是否有人不必要地分配大块内存等,然后尝试解决该问题。如果仍然找不到解决方案,那么找出程序的哪个部分占用大部分内存并尝试重新设计其内存分配模型。
答案 4 :(得分:2)
对于那些建议不要使用位域保存内存的人:随着岁月的流逝和计算机获得更多的千兆字节,L1 $(快速内存)仍然只有几十千字节。对于今天的大多数应用程序,大部分时间都花在等待慢速内存到达L1 $。
由于慢速内存是大多数应用程序的瓶颈,因此使用位域保存内存实际上可以显着提高应用程序的速度。二十年前情况并非如此。
答案 5 :(得分:1)
在我看来,将自己的短裤装入单个短片中比使用结构更容易,更容易出错。如果确实需要使用更少的内存,则可以使用struct指定位域:
struct myStruct {
int data:8;
int result:8;
};
它实现了相同的内存减少结果,同时提高了代码的整体可维护性。
答案 6 :(得分:0)
具有位域的结构是最容易理解的实现。如果您不使用该方法,则可以使用一组记录良好的 宏,将值对打包并解压缩为16位值。< / p>
答案 7 :(得分:0)
使用结构/对象不一定是最好或最清晰的方法。
假设你有一组简单的整数数据点,但它们可以被删除或标记为无效,如果你只是使用MSB标记为'不使用',那么你需要添加到算法中的所有数据
if ( item > 0 )
item += blah
但是如果你有一个结构,那么算术的每一点现在都需要成员访问
if ( item.valid() )
item.setValue(item.getValue() + blah);