【问题标题】:HALF_PTR Windows data typeHALF_PTR Windows 数据类型
【发布时间】:2011-03-21 14:28:01
【问题描述】:

VS 文档说明

指针大小的一半。在包含一个指针和两个小字段的结构中使用。

Windows Data Types

这种类型到底是什么?如果有的话,它是如何使用的?

【问题讨论】:

    标签: c++ windows pointers types


    【解决方案1】:

    我在 Intel 的网站上找到了this article,他们建议在你有一个包含许多指针成员的类的上下文中使用它,以及一个 32 位偏移量来获取实际地址,以减少数据膨胀一类的。这篇文章专门讨论了 Itanium 平台,因为它使用 64 位指针而不是 32 位,但我认为问题/问题的解决方案在任何使用 64 位指针的系统上都是相同的。

    因此,简而言之,它似乎表明可以在您希望减少类的内存占用等情况下使用它?

    【讨论】:

    • 链接已失效,导致答案无效。这就是link only answers are discouraged 的原因。而“32 位偏移量”只是一个偏移量,而不是一个 HALF_PTR,其中两半组合成一个指针
    【解决方案2】:

    我猜“在包含一个指针和两个小字段的结构中使用”是指由两个 HALF_PTR 以及其他两个非指针小数据字段构成的指针

    struct Packed {
        HALF_PTR low_ptr;
        HALF_PTR high_ptr;
        SMALL one;
        SMALL two;
    };
    struct Padded {
        void *ptr;
        SMALL one;
        SMALL two;
    };
    
    • 在 32 位 Windows 上:
      • SMALLchar 时:sizeof(Packed) == 6sizeof(Padded) = 8
      • SMALLshort 时:两个结构的大小都是8,但前者的对齐要求只有2 与4 相比
    • 在 64 位 Windows 上:
      • SMALLchar 时:sizeof(Packed) == 10sizeof(Padded) = 16
      • SMALLshort 时:sizeof(Packed) == 12sizeof(Padded) = 16
      • SMALLint 时:大小相同,但减少了上述对齐要求

    这与Philipp's answer 不同,无论拆分成两半,结构的大小和对齐方式都完全相同

    struct Example1 {
        void* pointer;
        HALF_PTR one;
        HALF_PTR two;
    };
    struct Example2 {
        void* pointer;
        void* one_two;
    };
    

    两者的对齐方式等于指针的大小,以及 2 个指针的大小

    【讨论】:

      【解决方案3】:

      在包含一个指针和两个小字段的结构中使用。

      这意味着在以下结构中,不需要填充:

      struct Example {
          void* pointer;
          HALF_PTR one;
          HALF_PTR two;
      };
      

      当然,这仅在HALF_PTR 的大小(64 位系统上为 32 位,32 位系统上为 16 位)足以容纳预期值时才相关。

      【讨论】:

      • 忘记了填充位。 +1。
      • @Hans Passant:为什么需要工会?您可以在这里确定sizeof(struct Example)2*sizeof(void*)。这里不需要工会。
      • @Billy:好吧,您可以使用 HALF_PTR 来访问指针的各个部分。就像你在回答中所做的那样。
      • @Hans Passant:文档并没有指出应该使用HALF_PTR 来访问指针的各个部分——毕竟,将指针分成两部分可以获得什么?我认为引用表示的用法类似于我的示例中的用法。
      • 你建议如何初始化它们?
      【解决方案4】:

      注意:匿名结构不是标准的,但 MSVC 采用它们:

      union
      {
          int * aPointer
          struct
          {
              HALF_PTR lowerBits;
              HALF_PTR upperBits;
          };
      } myvar; //You can be assured this union is sizeof(int *)
      

      如果您认为它们不是非常有用,那您是对的。

      【讨论】:

        猜你喜欢
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        相关资源
        最近更新 更多