菜单

跨平台支持

相关源文件

Protocol Buffers 提供强大的跨平台支持,使开发人员能够编写在不同操作系统、编译器和硬件架构上一致运行的代码。本页面介绍了 Protocol Buffers 如何实现平台独立以及支持哪些平台。

平台独立性策略

Protocol Buffers 结合使用条件编译、平台检测宏和精心设计的抽象来在各种环境中保持兼容性。

来源

支持的平台

Protocol Buffers 支持广泛的平台,确保在各种开发环境中具有广泛的兼容性。

编译器支持

Protocol Buffers 支持以下编译器,并有最低版本要求:

编译器最低版本备注
Clang6.0通过编译时检查强制执行
GCC7.3通过编译时检查强制执行
MSVC2017 (v19.10)通过编译时检查强制执行

如代码库中所述,所需的最低 C++ 版本为 C++17。

来源

架构支持

Protocol Buffers 支持多种 CPU 架构,并针对每种架构进行了优化:

架构支持级别示例
x86-64 (64 位)完全支持Intel/AMD 现代 CPU
x86 (32 位)完全支持较旧的 Intel/AMD CPU
ARM (32/64 位)完全支持移动设备、Raspberry Pi
AARCH64完全支持现代 ARM 64 位
MIPS/MIPS64支持-
PowerPC支持-
SPARC支持-

来源

操作系统支持

Protocol Buffers 为主流操作系统提供支持:

操作系统支持级别备注
Linux完全支持主要的开发平台
Windows完全支持Windows 宏特殊处理
macOS完全支持-
iOS支持带有线程模型适配
Android支持带有线程模型适配
Solaris支持-
AIX支持-
FreeBSD支持-
Emscripten (WebAssembly)支持-

来源

跨平台抽象机制

Protocol Buffers 采用多种关键抽象机制来确保跨平台的行为一致性。

平台检测流程

来源

内存管理

Protocol Buffers 通过精心设计的抽象来实现跨平台的内存管理。

  1. Arena 分配:一个在不同平台上一致工作的自定义内存管理系统
  2. 对齐控制:平台感知的内存对齐
  3. 指定大小的释放:根据平台功能正确处理内存释放

来源

特定于编译器的优化

Protocol Buffers 会根据编译器功能进行调整以获得最佳性能:

  1. 函数内联:使用特定于编译器的内联指令
  2. 分支预测:特定于平台的预分支预测提示
  3. 预取:架构感知的内存预取
  4. 对齐控制:特定于编译器的对齐指令

来源

线程模型

Protocol Buffers 提供跨平台的线程局部存储。

来源

平台特定考量

Windows 特定处理

Protocol Buffers 针对 Windows 平台进行了特殊处理,尤其是在宏冲突以及 DLL 导出/导入方面。

  1. 宏冲突:Windows 头文件定义了许多与 Protocol Buffers 标识符冲突的宏。
  2. DLL 导出/导入:共享库符号的特殊处理。
  3. MSVC 特定编译器标志:目标警告抑制。

来源

Apple 平台注意事项

macOS 和 iOS 的特殊处理

  1. macOS/iOS 宏处理:处理特定于平台的宏
  2. iOS 线程模型:适应 iOS 线程限制

来源

字节序处理

Protocol Buffers 在具有不同字节序的平台之间正确处理数据序列化和反序列化。

来源

跨平台开发最佳实践

在使用 Protocol Buffers 进行跨平台项目时:

  1. 包含保护:始终使用正确的包含模式,包含 port_def.incport_undef.inc

  2. 使用提供的宏:利用平台抽象宏,而不是编写特定于平台的代码

    • 使用 PROTOBUF_ALWAYS_INLINE 代替特定于编译器的内联指令
    • 使用 PROTOBUF_THREAD_LOCAL 进行线程局部存储
    • 使用 PROTOBUF_ATTRIBUTE_WEAK 支持弱符号
  3. 对齐注意事项:使用提供的对齐宏(如 PROTOBUF_ALIGNAS)以实现正确的内存对齐

  4. 跨平台测试:在所有目标平台上验证您的 Protocol Buffers 实现

来源

最低要求和兼容性

Protocol Buffers 确立了明确的最低版本要求,以确保兼容性:

  • C++ 标准:C++17 或更高版本
  • 编译器:
    • Clang 6.0+
    • GCC 7.3+
    • MSVC 2017 (19.10) 或更高版本
  • Abseil 库:版本 20230125.3 或更高版本

代码库包含运行时检查,以验证这些要求是否已满足。

来源


通过利用这些跨平台抽象,Protocol Buffers 在广泛的平台上提供了统一的开发体验,同时仍能利用平台特定的优化(如果可用)。