2012-05-10 1 views
-2

가능한 중복 : 나는 코드의 조각을 다음에 7 행에서 경고 '임시의 주소를 복용'얻을
taking address of temporary while accessing address of a element in vector<bool>경고 "임시의 주소를 복용"


1 vector<bool> boolVect;<br/> 
2 bool x = true;<br/> 
3 boolVect.push_back(true);<br/> 
4 boolVect.push_back(false);<br/> 
5 ofstream fMetaOut("tmp.txt", ios::out);<br/> 
6 fMetaOut.write((char*)&x, sizeof(bool));<br/> 
7 fMetaOut.write((char*)&boolVect[0], sizeof(bool));<br/> 
8 fMetaOut.close(); 

왜이 경고 메시지가 7 번에 표시되고 6 번에 표시되지 않습니까? 둘 다 부울 주소를 사용합니다.
어떻게하면이 경고를 없앨 수 있습니까?

+9

[5 개월 전] 동일한 문제가 있지 않았습니까? (http://stackoverflow.com/questions/8324699/taking-address-of-temporary-while-accessing-address-of-a-element-in -vectorbool)? – Blastfurnace

+0

죄송합니다 .. 그리고 감사합니다! – Rahul

+1

@Blastfurnace 거기 기억하십니까? 너가 그의 오래된 질문을 우연히 만난 것은 우연의 일치라고 말해! –

답변

6

x은 임시가 아니며 스택에있는 자동 변수 인 l 값입니다.
동안, &boolVect[0]은 1 값이 아닙니다.
l-value는 주소를 취할 수있는 엔티티로, 수명이 그 메모리에 상주 할만큼 충분히 길기 때문에 이름으로 처리 할 수 ​​있습니다.

vector<bool>의 문제점은 무엇입니까 ?? vector<int>

C++ 표준 라이브러리는 부울 유형에 대한 벡터의 특수화를 제공합니다. 목표는 bool의 벡터의 일반적인 구현보다 작은 크기를 사용하는 최적화입니다. bool의 일반적인 구현은 각 요소에 대해 적어도 1 바이트를 예약합니다. vector<bool> 특수화는 일반적으로 요소에 대해 내부적으로 1 비트만을 사용하므로 일반적으로 8 배 더 작습니다. 그러나이 최적화는 가격과 함께 제공됩니다 :
C++에서 주소 가능한 최소값은 적어도 1 바이트 크기 여야합니다. 따라서 벡터의 이러한 특수화는 참조 및 반복자에 대한 특수 처리가 필요합니다. 결과적으로 vector<bool>은 다른 벡터의 모든 요구 사항을 충족하지 못합니다. 당신이 보는 행동은 그와 같은 예이고, vector<bool>의 요소는 실제 값이 아닙니다.

+0

벡터 의 문제점은 무엇입니까 ?? 벡터 에 대해서는 정상적으로 작동합니다. – Rahul

+0

@Rahul : 자세하게 설명하도록 Ellaborated. –

2

vector의 다른 특수화와 달리 vector<bool>bool 개체의 배열을 관리하지 않습니다. 대신 포장 된 비트 필드를 관리합니다.

비트가 개별적으로 주소 지정이 가능하지 않기 때문에 boolVect[0]bool을 참조하지 않습니다. bool으로 변환 할 수있는 유형의 (임시) 객체입니다. 벡터 요소에 대한 참조 또는 포인터를 가져 오는 방법은 없습니다.

참조 할 수있는 불리언 플래그가있는 컨테이너를 원하면 vector<char> 또는 deque<bool>이 적합 할 수 있습니다.

주소가 x 일 때 (비 임시) bool 개체이므로 괜찮습니다.