当前位置: 首页 > 工具软件 > lite-proto > 使用案例 >

protobuf-lite的使用C++ 及 windows 平台内存泄露解决方法

谯嘉木
2023-12-01

 protobuf虽然很好,还有一个问题,NDK编译出的Lib SO 近20M,如果在android 上使用,明显不合适。造成包体积过大。

所以想到了  protobuf-lite,相对体积减小十倍;

相对 protobuf 也很简单,在生成文件里 *.proto文件修改,添加option optimize_for = LITE_RUNTIME;

可知成 protobuf-lite使用的类;

例 proto 文件:

syntax = "proto3";
package IM.BaseDefine;
option java_package = "com.data.common.protobuf";
option optimize_for = LITE_RUNTIME;

message Request
{
    string version = 1; // 后台接口与客户端通讯协议版本
   
}

我在网上查了一下:

option optimize_for = LITE_RUNTIME;
      optimize_for是文件级别的选项,Protocol Buffer定义三种优化级别SPEED/CODE_SIZE/LITE_RUNTIME。缺省情况下是SPEED。


      SPEED: 表示生成的代码运行效率高,但是由此生成的代码编译后会占用更多的空间。


      CODE_SIZE: 和SPEED恰恰相反,代码运行效率较低,但是由此生成的代码编译后会占用更少的空间,通常用于资源有限的平台,如Mobile。


      LITE_RUNTIME: 生成的代码执行效率高,同时生成代码编译后的所占用的空间也是非常少。这是以牺牲Protocol Buffer提供的反射功能为代价的。因此我们在C++中链接Protocol Buffer库时仅需链接libprotobuf-lite,而非libprotobuf。在Java中仅需包含protobuf-java-2.4.1-lite.jar,而非protobuf-java-2.4.1.jar。

      SPEED和LITE_RUNTIME相比,在于调试级别上,例如 msg.SerializeToString(&str) 在SPEED模式下会利用反射机制打印出详细字段和字段值,但是LITE_RUNTIME则仅仅打印字段值组成的字符串;

 

     因此:可以在程序调试阶段使用 SPEED模式,而上线以后使用提升性能使用 LITE_RUNTIME 模式优化。

 

如果使用dll 可能会遇到下面错误:

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2001 无法解析的外部符号 "class google::protobuf::internal::ExplicitlyConstructed<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > google::protobuf::internal::fixed_address_empty_string" (?fixed_address_empty_string@internal@protobuf@google@@3V?$ExplicitlyConstructed@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@123@A) Protote C:\Users\JiangXinBin\Documents\Visual Studio 2015\Projects\Protote\Protote\person.pb.obj 1

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2001 无法解析的外部符号 "private: static bool google::protobuf::io::CodedOutputStream::default_serialization_deterministic_" (?default_serialization_deterministic_@CodedOutputStream@io@protobuf@google@@0_NA) Protote C:\Users\JiangXinBin\Documents\Visual Studio 2015\Projects\Protote\Protote\person.pb.obj 1

添加 宏定义:PROTOBUF_USE_DLLS 预处理就可以了.

 

注意:vc 会有内存泄露,在退出时或析构时加上;

google::protobuf::ShutdownProtobufLibrary();

 类似资料: