encodeffloat在Google Protobuf中是如何工作的?

How does EncodeFloat work in Google Protobuf?

本文关键字:工作 何工作 Google Protobuf encodeffloat      更新时间:2023-10-16

所以他们有:

inline uint32 WireFormatLite::EncodeFloat(float value) {
  union {float f; uint32 i;};
  f = value;
  return i;
}

我不明白。我们没有看到i的任何价值…所以如何?这里发生了什么?

在联合中,成员的存储重叠。如果这两个元素有相同的大小(例如,如果你可以assert(sizeof(float) == sizeof(uint32))) 对齐,那么你真正做的是:

  1. 存储floatf的位置
  2. i的位置读取uint32是相同的位置

你同样可以

return *reinterpret_cast<uint32 *>(&value);

(同样,只要您确定两种类型的大小相同,并且具有相同的对齐要求)