3월, 2021의 게시물 표시

[C++] bool을 담은 vector가 foreach에서 동작하지 않는 이유

이미지
vector<bool>를 foreach에서 사용하려다가 컴파일 오류가 발생했다. 다른 primitive type, object type 에서는 발생하지 않아서 신기함을 느끼고 찾아보게 되었다. bool은 바이트 단위로 표현하면 1byte라고 볼 수 있지만, 내부적으로는 1bit만 사용하게 되므로 나머지 공간을 사용하지 않아서 메모리 관점에서 비효율이 발생한다. (char는 1byte를 제대로 사용하는 것과 비교된다.) 'vector<bool>는 내부적으로 1byte에 여러 개의 bool 값을 저장한다. (dynamic bitset)' 라 는 답변이 가장 와닿았고, 이를 바탕으로 더 찾아보게 되었다. 메모리 공간 최적화로 인해서, 표준 컨테이너의 기능과 인터페이스를 다소 잃게 된다. vector<bool>에서 operator[]는 bit를 조작할 수 있는 프록시 객체를 반환하게 되는데, 프록시 객체는 bool &이 아니기 때문에, bool *에 주소를 할당할 수 없다는 것이다. 예) bool * b = & v[0];    //Compile Error  이와 대조적으로, deque는 이러한 특수화가 이루어지지 않으므로 bool은 1byte를 취하고, operator[]에서 반환된 값의 주소를 가져올 수 있다. (의도한 방향) Proxy Class는 다른 클래스에 원하는 인터페이스 사용 을 위해서 사용하는 대리자 역할을 한다. 위에 operator[]처럼 1bit(0과 1)만 사용하기를 원하는 경우, 이를 표현하게 해준다. https://stackoverflow.com/questions/994488/what-is-proxy-class-in-c (1) vector<bool>의 내부적 구현 => Proxy Object로 반환(rvalue) => 반복자(iterator)는 lvalue만 참조가능 => Compile Error! (2) vector<char>의 내부...