【问题标题】:About offsetof usage in C and C++?关于 C 和 C++ 中的 offsetof 用法?
【发布时间】:2014-05-08 03:14:24
【问题描述】:

在 C 中,我看到了 offsetof 的一些用法来计算结构中成员到其开头的偏移量?

是否仍建议在 C++ 中使用?没有这个宏还有其他方法吗?

【问题讨论】:

  • offsetof can be used in C++ 具有 If type is not a standard-layout class (Clause 9), the results are undefinedThe result of applying the offsetof macro to a field that is a static data member or a function member is undefined. 的限制。
  • 您应该认真问问自己为什么需要“offsetof”宏的功能。它在 C++ 中可用,但它会给非 POD 结构和类带来意想不到的结果。如果您不知道 POD 是什么,那么您最好不要在 C++ 代码中使用它。除非你有充分的理由,否则最好不要在 C 代码中使用它。
  • 为什么每个人都反对使用它?在计算内联汇编的偏移量或计算可更改的 POD 结构的偏移量(Wintenl.h 中的 WINAPI 的 TEB 结构)以及计算 x32 与 x64 代码中的偏移量而不对偏移量进行硬编码时,它很有用..
  • 如果需要,使用它并没有什么坏处。如果这正是您所需要的,我建议您不要创建自己的实现。它在 C++ 标准中得到官方支持。我建议你多考虑一下你的设计,看看你是否真的需要它。
  • @CantChooseUsernames:然而,真正的问题是你为什么需要知道?目前,我想不出一个需要使用它的问题。

标签: c++ offsetof


【解决方案1】:

C++ 有指向成员的指针。这些类似于偏移量,但 (1) 类型安全和 (2) 更通用 - 它们也适用于方法、基类等。

【讨论】:

    【解决方案2】:

    Offsetof 是仅在 C++ 标准中用于 C 兼容性的功能,因此不建议在 C 字中使用

    【讨论】:

      【解决方案3】:

      除非你真的需要,否则我不会推荐它。只要您的使用在 C 中有效,它就应该对 C++ 有效。不知道你在做什么,你的问题是不可能回答的。

      【讨论】:

        【解决方案4】:

        不,不是。

        正确的C++ 风格鼓励用户尽可能避免所有低级细节。这既是为了安全/正确性和可读性。只有当低级操作保证真正和显着的性能改进时,才应该跳入其中​​。

        【讨论】:

          【解决方案5】:

          offsetof() 的一种用法是在类似 C 的代码中具有具有固定标头的结构和可变大小的数组,如本博文中所述:

          Why do some structures end with an array of size 1?

          (注意这篇博文使用FIELD_OFFSET宏,这是一个Windows-ism,对应offsetof()。)

          我认为在现代 C++ 中,我们应该使用更高层次的技术和代码,例如 std::vector 用于可变大小的数组。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-14
            • 2019-09-16
            相关资源
            最近更新 更多