2011-05-04 6 views
2

구조체에서 파일로 내 보낸 다음 해당 파일을 mmap()합니다. 하나의 문제는 구조체가 문자열 인 멤버 변수를 가지고 있으며 mmap이 어떻게 처리 할 지 확신 할 수 없다는 것입니다. 이 경우 모든 문자열은 동일한 크기 (8 자)입니다. 나는 리눅스 mmap() 함수를 복제하기로되어있는 온라인에서 찾을 수있는 mmap() 함수를 사용하고 있지만, 윈도우에서 일하고있다.구조체를 파일로 내보내고 파일을 메모리 맵핑하는 방법은 무엇입니까?

struct testStruct 
{ 
    string testString; 
    unsigned int testInt; 
    unsigned int tsetArr[9]; 
}; 

은 그것이 개체를 sizeof()의 반환 값을 정의 할 수있다 : 같이

구조체 자체

정의 되는가?

구조체 데이터가 포함 된 파일을 mmapping 할 수 있습니까?

구조체를 파일로 내보내고 mmap하면 어떤 코드를 사용해야합니까?

답변

6

std::string의 표현은 C++ 표준에서 보장 할 수 없으므로 작동하지 않습니다. std::string은 힙의 어디에나 내용을 할당 할 수 있기 때문에 문자열 자체가 아닌 포인터와 크기 멤버를 저장하게됩니다.

chartsetArr과 같은 컴파일 타임 상수 크기의 배열이 작동해야합니다.

개체에 sizeof()의 반환 값을 정의 할 수 있습니까?

번호 sizeof는 함수가 아닙니다, 그래서 당신은 그것을 오버로드 할 수없는 (그리고 어느 곳에서하지 반환을 수행하기 때문에 엄격하게, 그것은 아니지만 반환 값있다; 컴파일러에 의해 상수로 확장되었습니다).

struct 데이터를 포함하는 파일을 mmapping 할 수 있습니까?

가능하지만 반대합니다. 귀하의 코드는 이식 가능하지 않으며, 아마도 같은 플랫폼의 다른 컴파일러조차도 아니며, 귀하의 struct은 돌로 던져집니다. 어쨌든 그렇게하려면 포인터 구성원이없는 mmap POD (일반 이전 데이터) 만 unsigned version 구성원을 struct에 넣고 정의가 변경 될 때마다 증가시킵니다.

+0

감사합니다. 모든 문자열에 같은 문자 수 (8)가 있다고 가정하면 문자열 벡터를 메모리 맵핑 할 수 있습니까? – Tristan

+0

@Tristan :'std :: vector'는'std :: string'과 같은 문제가 있습니다 : 그것은 힙에 내용을 할당합니다 (그리고 성장을 위해 필요하다면 위치를 바꿀 수도 있습니다). 2-d 배열 (일부 컴파일시 상수'N '의 경우 char [N] [8])이 작동해야합니다. –

+0

다시 한번 감사드립니다. mmap에 8 문자 문자열의 파일을 2-d 배열로 읽은 다음 그 N 항목 각각에 문자열로 액세스하는 가장 빠른 방법은 무엇입니까? 속도가 중요하므로 수십만 개의 항목을 다루게 될 것입니다. – Tristan

1
struct testStruct 
{ 
    char testString[9]; 
    unsigned int testInt; 
    unsigned int tsetArr[9]; 
};