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