사용비트사이즈 제한

회사에서 코드를 보던중

struct Object
{
    unsigned value : 16;
};

이런 코드가 있길래 뭔가 하고 테스트를 해봤더니 사용하는 비트수를 제한하는 것 같다. (아마도) 테스트를 한 코드는

#include <iostream>
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;
}

이런 느낌!!
결과는

sizeof TestStruct : 4
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.
맨 처음에 위에 있는 코드만 보고
– 아 그냥 원래 데이타타입이랑 똑같은 메모리 공간을 사용하는데 비트수만 제한하나 보군
이라고 생각했는데

struct UnionObject
{
  union
  {
    struct
    {
      unsigned small1 : 16;
      unsigned small2 : 16;
    };
    unsigned int value;
  };
};

이 코드를 보니 뭔가 이상하다. 문맥상은 value 와 small1, small2 의 메모리 공간이 공유 되게는걸 의도한것 같은데 위의 결과를 보면 비트수를 제한해도 4바이트를 차지하니 value 와 small1 만 공유될것 같은데… 라고 생각해서 테스트를 해보니 UnionObject는 그냥 4바이트만 차지하는게 아닌가?

그래서 이것저것 테스트

struct TestStruct
{
  unsigned value : 8;
};

이 구조체는 4바이트를 차지하는데

struct TestStruct
{
  unsigned value : 8;
  unsigned value2 : 8;
  unsigned value3 : 8;
  unsigned value4 : 8;
};

이 구조체 역시 4바이트만 차지함. 저기서 하나 더 추가하거나 제한 비트숫자를 1만 올려도 8바이트를 차지한다.

음… 저게 원래 저런건지 아니면 비주얼스튜디오의 4바이트 정렬 옵션 때문에 저런 결과가 나오는건지는 잘 모르겠다.
냠… 책에서 읽었던 기억이 살포시 나는데 쓸일이 없다보니 이미 까먹은…. -_-;

“사용비트사이즈 제한”에 대한 3개의 댓글

  1. 원래 저렇게 쓸 수 있엉~
    저렇게 쓰는 것 중에서는 union 조합이 압권이지.
    예전에 패킷 크기 줄이려고 저런 짓을 했던 기억이 나는군.
    Windows DDK 쪽 구조체 저렇게 된 거 겁나 많아.
    그런데 요새는 거의 안쓰는구먼 -ㅂ-;

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다