2013-11-28 3 views
5

는 구조체 다음 사항을 고려하십시오 : 나는 공유 메모리 영역을 만들 부스트 :: 간을 사용하고프로세스 메모리에 boost :: optional을 사용하는 것이 안전합니까?

struct ThingThatWillGoInSharedMemory { 
    boost::optional<int> opt_value; 
}; 

. boost :: optional에 대한 나의 이해는 nullable 포인터보다는 차별화 된 union이라는 것이었다. 힙을 사용하는 std :: map 및 std :: vector와 같은 것들은 프로세스 메모리에서 사용하기 위해 명시 적 할당자가 필요하지만 boost :: optional을 사용하면 힙을 사용하지 않으며 이에 상응하는 쓰기 :

struct ThingThatWillGoInSharedMemory { 
    bool value_initialised; 
    int value; 
} 

그래서 상자에서 사용할 수 있습니다. 만약 누군가가 이것을 확인하면 나는 기뻐할 것입니다. 프로세스의 케이스가 명시 적으로 boost :: optional 문서에 언급 된 것을 보지 못했습니다. 단지 함축되어 있습니다.

답변

1

정확합니다. boost :: optional은 포인터 간접 참조 대신 값을 래핑합니다. 즉, int와 같은 일반 오래된 데이터 객체는 공유 메모리 영역에 살 수 있습니다. 일반적으로 힙을 사용하는 객체는이 방법으로 사용할 수 없습니다. 부스트 :: 선택 문서에서

:

옵션과 포인터의 차이는 관계 연산자의 의미가 다른 특히 때문에, 명심해야합니다 옵션은 부가가치이기 때문에 래퍼 ...

boost :: optional은 포인터와 간접 참조를 사용하는 대신 값을 래핑합니다. boost :: optional의 메모리 레이아웃의 기본 모델은 다소 정확합니다. 실제 구현에서는 T 객체를 초기화하지 않아도되도록 일반 정렬 된 바이트 버퍼를 래핑하는 공용체를 사용합니다. 라이브러리는 & (주소 연산자)를 사용하여 프로세스 주소 공간에서 바이트 버퍼의 로컬 매핑 주소를 가져옵니다. 이 로컬 메모리 주소는 T 타입의 포인터 또는 참조로 변환됩니다.

소스 코드는 <boost/optional/optional.hpp>

에서 찾을 수 있습니다.