使用Boost Endian算术类型被认为是好的做法吗?

时间:2017-12-09 16:23:06

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

作为嵌入式软件工程师,我在公司里相当新,而且我必须处理很多网络问题。我必须一直用C ++编程,并使用我的同事的代码,我注意到他们使用结构来构建数据包,以便使用TCP / UDP通过网络发送。为此,因为我们使用的机器是little-endian,所以必须将所有内容转换为big-endian。因此,在必须发送数据的那一刻,他们使用已知的函数作为htons,ntohs等。

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

1 个答案:

答案 0 :(得分:4)

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

endian类型不是零成本抽象。将它们用于被动存储以外的任何其他操作都会损害性能(想象一下,对非本机端数字进行数字处理。处理器可能会花费更多时间在高阶/低阶字节和单词上跳舞,而不是实际计算。)

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

我知道Boost Endian类型,并且更喜欢他们在心跳中反复写ntoh和朋友。

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

也许这种模式适用于许多开发人员,并没有解释Boost Endian的很多例子?