項目里shared memory存放的數據結構,現在需要將其同時用于server與client之間的相應數據交互。server與client之前的協議格式為protobuf。
為了只維護一份代碼,準備將之前用于shared memory的結構轉化為protobuf,然后兩處都用這個protobuf。
搞了一會兒,才想起shared memory里只適合存定長的非指針結構。
汗,這個幾年前就經歷過,那個時候是學生時代做五子棋世界的時候,貌似是想往shared memory里存放std::map。
當時水平太低,報錯了就放棄了stl的容器,寫些了中規中矩的結構體。
這次就順便搜下當年那個問題的解決方法。找到個說的挺好的:http://www.cnblogs.com/fullsail/archive/2013/01/20/2868898.html。
大意就是,stl里容器會動態分配內存,而且new的東西在自己的進程空間里,別的進程訪問時必然是個不對的指針。需要將stl的分配器定制為從共享內存里分配空間,或者其他幾個鏈接里提到的方法。
回到我現在遇到的protobuf這個問題,protobuf里有些如repeated或者string等會動態new,這個如果做內存分配的定制,還得重改protobuf的代碼,復雜度比較高。
加上項目里的這單個協議格式制定的需求只是臨時的,就更沒必要了。最終放棄protobuf結構直接映射到共享內存的企圖。