언어 기능 : 부울을 깃발 + 비트 마스크에 최적화합니다
-
05-07-2019 - |
문제
나는 프로그래밍 언어를 쓰고 있고 내가 만났을 때 이 질문, 나의 즉각적인 생각은 언어가 Booleans를 프로그래머의 비트 깃발로 최적화해야한다는 것입니다. 이는 유지 보수 부담과 더 복잡한 비트 조작으로 인한 오류 가능성을 제거하면서 속도와 효율적인 메모리 사용의 모든 이점을 유지합니다.
이 최적화를 원하지 않을 수있는 한 가지 사례는 부울 한 세트가 저장되는 상황이있는 경우입니다. 기본적으로, 당신이 있다면 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
. 부울이 더 스토리지 최적이 될 수있는 몇 가지 사례가 감지하기 쉬운 것처럼 보입니다. ~ 아니다 최적화를 적용하십시오.
언어 가이 최적화를 지원하지 않는 이유가 있습니까? 나는 주위를 둘러 보았고 어떤 언어도하지 않는 것 같지 않습니다 (올바른 장소를보고 있지 않을 수도 있습니다).
해결책
나는 사람들이 어셈블리 언어로 이것을하는 것을 보았습니다. 여기서 부울은 공간을 절약하기 위해 단어로 포장 한 다음 비트를 얻거나 설정하기위한 많은 지침을 작성했습니다.
분명히 부울을 포장하고 포장하지 않는 속도와 메모리에는 분명히 트레이드 오프가 있으며, 개인적으로 나는 컴파일러가 나를 위해 그것을 결정하려고 노력하고 있습니다.
다른 팁
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;
}
실행되면이 4 개의 필드는 하나의 바이트로 포장됩니다.
$ gcc -Wall -o bittest bittest.c
$ ./bittest
1