회사에서 코드를 보던중
{
unsigned value : 16;
};
이런 코드가 있길래 뭔가 하고 테스트를 해봤더니 사용하는 비트수를 제한하는 것 같다. (아마도) 테스트를 한 코드는
using namespace std;
struct TestStruct
{
unsigned value : 16;
};
struct TestStruct2
{
unsigned value;
};
int main()
{
TestStruct a;
TestStruct2 b;
a.value = 65535;
b.value = 65535;
cout<<“sizeof TestStruct : “<<sizeof(TestStruct)<<endl;
cout<<“value TestStruct::value : “<<a.value<<endl;
a.value++;
cout<<“value TestStruct::value++ after”<<endl;
cout<<“value TestStruct::value : “<<a.value<<endl;
cout<<“sizeof TestStruct2 : “<<sizeof(TestStruct2)<<endl;
cout<<“value TestStruct2::value : “<<b.value<<endl;
b.value++;
cout<<“value TestStruct2::value++ after”<<endl;
cout<<“value TestStruct2::value : “<<b.value<<endl;
return 0;
}
이런 느낌!!
결과는
value TestStruct::value : 65535
value TestStruct::value++ after
value TestStruct::value : 0
sizeof TestStruct2 : 4
value TestStruct2::value : 65535
value TestStruct2::value++ after
value TestStruct2::value : 65536
음…냐..
….
이런것도 있었구나!!!!
ps.
맨 처음에 위에 있는 코드만 보고
– 아 그냥 원래 데이타타입이랑 똑같은 메모리 공간을 사용하는데 비트수만 제한하나 보군
이라고 생각했는데
{
union
{
struct
{
unsigned small1 : 16;
unsigned small2 : 16;
};
unsigned int value;
};
};
이 코드를 보니 뭔가 이상하다. 문맥상은 value 와 small1, small2 의 메모리 공간이 공유 되게는걸 의도한것 같은데 위의 결과를 보면 비트수를 제한해도 4바이트를 차지하니 value 와 small1 만 공유될것 같은데… 라고 생각해서 테스트를 해보니 UnionObject는 그냥 4바이트만 차지하는게 아닌가?
그래서 이것저것 테스트
{
unsigned value : 8;
};
이 구조체는 4바이트를 차지하는데
{
unsigned value : 8;
unsigned value2 : 8;
unsigned value3 : 8;
unsigned value4 : 8;
};
이 구조체 역시 4바이트만 차지함. 저기서 하나 더 추가하거나 제한 비트숫자를 1만 올려도 8바이트를 차지한다.
음… 저게 원래 저런건지 아니면 비주얼스튜디오의 4바이트 정렬 옵션 때문에 저런 결과가 나오는건지는 잘 모르겠다.
냠… 책에서 읽었던 기억이 살포시 나는데 쓸일이 없다보니 이미 까먹은…. -_-;
근무시간에 블로깅 안 하는게 좋을걸? 특히 포스팅은.
너 지금 있는 곳은 트래픽 인/아웃바운드 및 패킷 내용까지 다 감시하는 곳이야.
크아 쾷옵
원래 저렇게 쓸 수 있엉~
저렇게 쓰는 것 중에서는 union 조합이 압권이지.
예전에 패킷 크기 줄이려고 저런 짓을 했던 기억이 나는군.
Windows DDK 쪽 구조체 저렇게 된 거 겁나 많아.
그런데 요새는 거의 안쓰는구먼 -ㅂ-;