1

我正在编写一种编程语言,当我遇到this question时,我的直接想法是语言应该将布尔值优化为程序员的位标志。这将保持速度和高效内存使用的所有好处,同时消除维护的负担以及由更复杂的位操作引起​​的错误的可能性。语言功能:优化布尔值为标志+位掩码

您可能不希望进行此优化的一种情况是,如果您遇到只存储一组布尔值的情况。基本上,如果你有8 bits for flags + 8 bit masks * 8 bits per bit mask = 72 bits而不是8 booleans * 8 bits per boolean = 64 bits。但只要你有两个布尔值副本,它就变成2 copies * 8 bits for flags + 8 bit masks * 8 bits per bit mask = 80 bits而不是2 copies * 8 booleans * 8 bits per boolean = 128 bits。似乎少数情况下,布尔值将更容易检测,因此可以使用而不是来应用优化。

有什么理由说语言不支持这种优化?我环顾四周,似乎没有任何语言(我可能只是不在正确的位置)。

回答

0

我见过人们用汇编语言来做这件事,他们把布尔变成单词来节省空间,然后写很多指令来获取/设置位。

很明显,在打包布尔之间存在一个速度和内存的折衷,而不是打包它们,我个人很害怕编译器试图为我做出决定。

+0

编译器,如C#和Java让你更大的决定的时候,而且他们往往不是。我只是想知道为什么这个特定的优化从未做过(即使在C#和Java中)。 – Imagist 2009-09-11 02:19:56

+0

@imagist:也许我是一个“多数人”,但我不理解编译器的积极优化。它几乎总是错位。真正认真的优化是我的工作。我希望编译器做的是生成“好代码”,但将真正的想法留给我。 – 2009-09-11 02:47:04

+0

@mike这个想法的问题在于,这些天优化编译器比人类更快,更准确,更有效。 – Imagist 2009-09-17 12:12:30

0

C不用...

#include <stdio.h> 

typedef struct foo_s { 
    unsigned char field1 :1; 
    unsigned char field2 :1; 
    unsigned char field3 :4; 
    unsigned char field4 :2; 
} foo_t; 

int main() { 
    printf("%d\n", sizeof(foo_t)); 
    return 0; 
} 

在运行时,这四个领域得到打包成一个字节:

$ gcc -Wall -o bittest bittest.c 
$ ./bittest 
1