便携对象(portable object),说实话,是我自创的名词。
这里便携的概念,有点类似POD,但更广泛 :内存连续的自描述的对象。通俗点: 不需要解析,直接通过拷贝内存及指针强转即可使用的对象。特性如下:
- 内存连续,有界
- 内部没有指针及其他绝对定位类型
- 自描述,不依赖、不引用外部对象
- 可通过指针指向或强转来完成构建,无需解析
便携对象用处非常多,比如对象持久化存储、网络通信、无锁并发操作等等。
因为有上面便携的特性,序列化/反序列化耗时基本为0,会在很大程度上提升系统效率。
Ok,便携对象正是我需要的,那怎么实现他呢?一般有3种途径:
- 直接使用POD类型,比如结构体。这种方式最直接,但也最不灵活,只能存定长数据,一旦需要变长的字符串等类型,那很不幸,你会面对一个复杂的麻烦。
- 利用google的flatbuffers。这种方式是先在连续内存中创建各个基础类型对象,然后按offset组织成复杂对象。相对灵活,但不爽的是需要写IDL,构造flatbuffers也是个比较痛苦的过程。并且,对于map等容器,flatbuffers也无能为力。
- 使用boost.interprocess中的方法。这主要利用定制boost标准容器的Allocator来实现在连续内存中创建对象,并对其用offset组织起来。优点是不需要额外的构造过程,操作统一。且支持boost的各种容器,包括map,甚至unordered_map。