我最近写使用相同无符号短以存储两个值,其结果和一个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);

它会更好只使用一个结构,以保持这两个值或是这种类型的共同点/可接受的?该方案已经存储了这么多的内存,我想我会开始想办法减少内存,它使用了。

有帮助吗?

解决方案

位字段(但只有当你真正需要的是空间紧张的 - 即嵌入式系统)?

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;

其他提示

除非内存是令人难以置信的紧张,我会去的结构路线。这是一个更加清晰这样,更容易对谁有权维护你的代码的下一个人。

我提醒当M68000有32个地址寄存器但实际上仅使用24他们的位的时间。程序员做了种种“优化”来存储信息的其他8位。男孩是他们的脸红色当芯片的更高版本,如M68030,使用的所有32位。

除非有绝对的内存紧缩,我宁愿去用于具有两个不同的变量结构更简单的方法。它增加了可读性,并降低了维护工作。

如果这样做是为了减少内存使用量的目的仅仅做了,那么我相信你不应该这样做。你是关闭使用具有2个短裤,使代码更可读的结构更好。内存你保存你比起来,通过使代码更易于维护得到了实惠这样做非常微小的量。

我建议你先分析的系统,以找出是否有内存泄漏,或者是否有人不必要分配的内存等大块,然后尝试解决这个问题。如果你仍然不能找到一个解决方案,然后找出你的计划的一部分占用了大部分的内存,并尝试重新设计它的内存分配模式。

对于那些谁建议对节约与位域内存:随着岁月的流逝和计算机获得更多的GB,L1 $(快速存储)仍然只有几十千字节。对于今天大多数的应用,大部分的时间都花在等待缓慢的内存在L1 $抵达。

由于慢存储器是在大多数应用中的瓶颈,与位域实际上可以显著提高应用程序的速度节约存储器。这二十年前不为真。

件既短裤成一个单一的短自己是,在我看来,更多的工作,也比使用一个结构更容易出错。如果使用较少的内存确实需要,你可以用一个结构指定位地址:

struct myStruct {
int data:8;
int result:8;
};

它实现相同的存储还原结果,同时增加了代码的整体可维护性。

和位字段结构是最理解实现。如果不使用这种方法,你可以使用一组的详细记录那包并解压值对进,出16位值。

使用结构/对象不一定最好或最清晰的方法。

假设你有一组简单的整数数据点,但他们可以删除或标记为无效,如果单纯使用MSB来标记为“不使用”,那么所有你需要添加到该算法是一个

if ( item > 0 )
   item += blah

但是,如果你有一个结构,然后arithmatic的每一位现在需要的成员访问

if ( item.valid() ) 
   item.setValue(item.getValue() + blah);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top