2012-01-30 2 views
1

데이터 멤버 (offsetof(mystruct, myfield))의 오프셋이 숫자 &mystruct::myfield으로 검색된 멤버 포인터의 원시 값과 같거나 구현에 종속되어 있다고 가정하는 것이 안전합니까?은 오프셋 된 데이터 멤버에 대한 포인터입니까?

+0

아니요로 가정하면 안됩니다. 컴파일러가 객체에 할당 된 메모리를 관리하기 위해 삽입 할 수있는 오버 헤드 (메모리)를 잊어 버립니다. – DumbCoder

+3

더 좋은 질문은 두 가지 형식을 알고 있기 때문에 회원에게 포인터를 사용하지 않는 이유는 무엇입니까? :) –

+0

내 프로그램이 offsetof를 사용하여 저레벨 트릭을 수행하기 때문에 실제로 포인터를 멤버로 사용하려고합니다. 표준형으로 "올리기"를 원합니다. –

답변

3

아니오; 멤버에 대한 포인터의 구현이 지정되지 않고 "원시"값을 얻기 위해 정의 된 변환이 없습니다.

0

공식적으로 이것은 구현에 따라 다릅니다. 실생활에서, 예, 데이터 멤버 포인터에 대한 포인터의 가장 일반적인 구현은 계획과 단순 오프셋, 즉 offsetof이 평가하는 것과 동일한 것입니다 (또는 기반으로합니다).

일부 구현에서는 정확한 포인터를 사용하여 0xFFF... 패턴을 사용하여 널 포인터 값을 나타냅니다. 일부 구현 예에서는 널 포인터 값에 대해 0x000... 패턴을 예약하고 모든 "null이 아닌"오프셋을 증가 시키려면 1만큼 패턴을 예약합니다.

관련 문제