【问题标题】:Is using the Boost Endian Arithmetic types considered good practice?使用 Boost Endian Arithmetic 类型是否被认为是好的做法?
【发布时间】:2017-12-09 16:23:06
【问题描述】:

作为嵌入式软件工程师,我是一家公司的新手,我必须处理很多网络问题。我必须一直用 C++ 编程,并使用我同事的代码,我注意到他们使用结构来构建数据包以使用 TCP/UDP 通过网络发送。为此,因为我们使用的机器是小端的,所以一切都必须转换为大端。因此,在必须发送数据的那一刻,他们使用已知的函数,如 htons、ntohs 等。

所以我一直在研究如何使我的代码可移植,这样程序员就不必关心他的机器的字节顺序,我偶然发现了 Boost 库的 Endian Arithmetic 类型,程序员可以用它来决定您的整数类型如何存储在内存中。在我会使用它们的上下文中,它们看起来非常好,但几乎没有任何地方提到它们。 Stackoverflow 仅发布关于如何无法以正确方式处理字节顺序问题的帖子,但这些算术类型对我来说似乎是一个不错的可移植解决方案。为什么这些类型几乎没有在任何地方被提及,也从来没有被提议过?它们有什么问题还是它们太新了?

【问题讨论】:

  • 我相信这主要是一个熟悉的问题,我当然认为 boost::endian 是一个经过深思熟虑的问题的答案。
  • @RustyX 是的,但是当您或使用您的代码的人忘记使用转换函数时,代码更容易出错。他/她甚至可能不知道,他/她将不得不考虑。 Endian Arithmetic 类型不需要大惊小怪。
  • htons 明确说明了转换发生的位置,这是一件好事,因为您编写一次代码,然后您和其他人会阅读多次。因此,可以说拥有可读的代码比易于编写更重要。

标签: c++ boost endianness portability integer-arithmetic


【解决方案1】:

这取决于在哪里。当然,在整个代码库中使用它们是一种设计权衡。

字节序类型不是零成本的抽象。将它们用于被动存储以外的任何东西都会损害性能。 (想象一下对非本地字节序数字进行数字运算。与实际计算相比,处理器可能会花费更多的时间来根据需要处理高位/低位字节和单词)。

如果您的应用程序是典型的,那么您将拥有不包含许多“实时”数据元素的 POD 传输缓冲区,并且引擎盖下自动字节顺序转换的纯粹好处可能值得任何开销。

我知道 Boost Endian 类型,我更喜欢它们而不是反复写 ntoh 和朋友。

实际上,尽管我已经编写了通用序列化助手(ntoh/hton 的使用被隔离到少数原始函数),或者使用了现有的库(例如 protobuf)。所以具有讽刺意味的是,我也没有将 Boost Endian 广泛用于任何生产代码。

也许这种模式适用于许多开发人员,没有太多关于 Boost Endian 的示例?

【讨论】:

  • 我同意。协议缓冲区消除了所有字节顺序的痛苦,并提供了高效的有线传输作为奖励(例如之字形编码)。为什么要重新发明轮子?
猜你喜欢
  • 2017-12-18
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 2013-04-12
  • 2010-12-22
  • 2021-12-18
相关资源
最近更新 更多