2014-02-23 23 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; 
} 

但是,這是我的理解,這是更難的數據類型vector>而不是一個簡單的整數。我是否需要編寫一個自定義的分配器(如果有的話,是否有任何簡單的方法可以做到這一點?我發現的例子都非常複雜......)來實現這個工作,或者這個例子有一個簡單的擴展那會讓我把一個vector放在共享內存中?

+0

退房Boost.Interprocess中。 –

+0

不幸的是,這實際上是一項家庭作業,明確提到「不要使用Boost」。我只是想知道是否有一個乾淨的方式來做到這一點... – user1023465

+0

你需要de- /序列化你的載體的內容! –

回答

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; 
} 

(或者,如果你不想使用C++風格的迭代)

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