C 표준은 malloc
으로 생성된 모든 주소값들이 4의 배수임을 보장한다.
왜 그런지는 제껴두고 이게 무슨 뜻이냐? 할당받은 모든 주솟값은 0b???????00 , ?{0,1}
즉 모든 주솟값의 첫 두 비트는 0임이 보장된다는 것이다. 이를 어떻게 활용하는가? reinterpret_cast 와 >> <<
로 두 비트에 다른 값을 넣어 두개 이상의 정보를 한 단어에 담을 수 있다는 말이다. 주소 + X + Y => 0b주주주주주주주주소XY
이렇게 압축시킨 데이터는 어디다가 쓰는가? atomic연산에 활용할 수 있다. 주로 cas
연산에 사용된다.
MSVC
x86, std::malloc으로 할당0x???0
|0x???8
. =>0b????000
; 3비트사용가능
x64, std::malloc으로 할당0x???0
. =>0b???0000
; 4비트 사용가능
테스트코드
while(true) { auto x = std::malloc(rand() % 100); cout << x << "\n"; }