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