【发布时间】:2013-05-17 20:12:05
【问题描述】:
我想在 C 中定义一个使用少于 4 个字节的布尔宏。我已经对此进行了研究,也许可以使用 gcc 定义一个 asm 宏,它可能会更少。定义要小很重要,因为我将拥有数以万计的矩阵来保存这些布尔值,重要的是它们可以尽可能地节省内存。理想情况下,我想定义一个代表真假的 4 位或 8 位宏,并将在 if 语句中进行评估。
编辑:
当我定义一个宏时
#define True 0
#define False !True
然后打印大小,返回一个4字节的大小,效率很低。
编辑2:
我刚刚阅读了有关 bitpacking 的内容,但是我可以将一点点用于布尔值是最好的。我只是不太确定如何对只有几位大小的打击进行位打包。
编辑3:
#include <stdio.h>
#include <string.h>
#define false (unsigned char(0))
#define true (!false)
int main() {
if (true) {
printf("The size of true is %d\n", sizeof(true));
}
}
给出以下输出
test.c: In function ‘main’:
test.c:8:9: error: expected ‘)’ before numeric constant
test.c:9:51: error: expected ‘)’ before numeric constant
【问题讨论】:
-
如何定义宏的大小?
-
您在寻找
char(或int8_t)吗? -
越小效率越高。字节在现代处理器上非常低效 32 或 64 位大小的值(寄存器的大小)是最有效的大小。 x86 有 8 位和 16 位以及 32 位和 64 位大小的寄存器,因此从这个角度来看,一个字节还不错,然后它会为了效率而进入总线传输(如果在 ram 中),并且单个字节的成本与更大的寄存器相同,因此无需努力让那个小..
-
避免使用 64 位整数的唯一原因是我的程序可以使用 26 GB 以上的 RAM。
-
当人们需要更高效地表示某事时,称他们为愚蠢是愚蠢的。