项目里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结构直接映射到共享内存的企图。