2014-02-23 2 views
0

C++의 공유 메모리에 플로트 벡터 벡터를 저장해야합니다. 공유 메모리에 정수를 저장하는 장난감 예제가 있습니다. 이것은 코드입니다 :C++에서 공유 메모리에 플로트 벡터 벡터를 저장하려면 어떻게해야합니까?

int main() 
{ 
    int pid; 
    int start = 0; 
    int shmid; 
    key_t key; 
    key = 123; 
    int *shm; 

    if ((shmid = shmget(key, sizeof(int), IPC_CREAT | 0666)) < 0) 
    { 
     perror("shmget"); 
     exit(1); 
    } 

    shm = (int *) shmat(shmid, NULL, 0); 

    pid = fork(); 

    if (pid > 0) 
    { 
     wait(NULL); 
     cout << *shm << *(shm+1); 
    } 
    else if (pid == 0) 
    {  
     *shm = 6; 
     *(shm+1) = 7; 
    } 
    else 
    { 
     exit(-1); 
    } 

    cout << endl; 
    return 0; 
} 

그러나 이것은 단순한 정수가 아닌 데이터 유형 벡터가 훨씬 더 어렵다는 것을 이해합니다. 커스텀 할당자를 작성해야합니까? (그렇다면 간단한 방법이 있습니까? 찾은 예제는 모두 꽤 복잡합니다 ...)이 작업을 수행하거나이 예제를 간단히 확장 한 것입니다 벡터를 공유 메모리에 놓을 수 있습니까?

+0

체크 아웃 Boost.Interprocess (또는, C++ 스타일의 반복을 사용하지 않는 경우). –

+0

불행히도 실제로는 "부스트를 사용하지 마십시오"라고 명시 적으로 언급 한 숙제입니다. 이 작업을 수행 할 수있는 확실한 방법이 있는지 궁금합니다 ... – user1023465

+0

벡터 내용을 삭제/직렬화해야합니다! –

답변

0

벡터 내부의 실제 요소가 std::vector<T>의 메모리 내에 저장되지 않지만 힙에 할당되기 때문에 std::vector<T>을 공유 메모리 영역에 저장할 수 없습니다.

기술적으로는 allocator을 직접 만들 수는 있지만 간단히 벡터의 내용을 직렬화하는 것이 더 쉽다고 생각합니다. 이 같은

뭔가 :

vector<float> vec_f; 
// some code fills vec_f .. 
float *shm; 
shm = (float *) shmat(shmid, NULL, 0); 

for(auto f : vec_f) 
{ 
    *shm++ = f; 
} 

for(size_t i = 0; i < vec_f.size(); i++) 
{ 
    *shm++ = vec_f[i]; 
} 
관련 문제