【发布时间】:2011-03-21 14:28:01
【问题描述】:
【问题讨论】:
标签: c++ windows pointers types
【问题讨论】:
标签: c++ windows pointers types
我在 Intel 的网站上找到了this article,他们建议在你有一个包含许多指针成员的类的上下文中使用它,以及一个 32 位偏移量来获取实际地址,以减少数据膨胀一类的。这篇文章专门讨论了 Itanium 平台,因为它使用 64 位指针而不是 32 位,但我认为问题/问题的解决方案在任何使用 64 位指针的系统上都是相同的。
因此,简而言之,它似乎表明可以在您希望减少类的内存占用等情况下使用它?
【讨论】:
我猜“在包含一个指针和两个小字段的结构中使用”是指由两个 HALF_PTR 以及其他两个非指针小数据字段构成的指针
struct Packed {
HALF_PTR low_ptr;
HALF_PTR high_ptr;
SMALL one;
SMALL two;
};
struct Padded {
void *ptr;
SMALL one;
SMALL two;
};
SMALL 是char 时:sizeof(Packed) == 6 但sizeof(Padded) = 8
SMALL 为short 时:两个结构的大小都是8,但前者的对齐要求只有2 与4 相比SMALL 是char 时:sizeof(Packed) == 10 但sizeof(Padded) = 16
SMALL 是short 时:sizeof(Packed) == 12 但sizeof(Padded) = 16
SMALL 为int 时:大小相同,但减少了上述对齐要求这与Philipp's answer 不同,无论拆分成两半,结构的大小和对齐方式都完全相同
struct Example1 {
void* pointer;
HALF_PTR one;
HALF_PTR two;
};
struct Example2 {
void* pointer;
void* one_two;
};
两者的对齐方式等于指针的大小,以及 2 个指针的大小
【讨论】:
在包含一个指针和两个小字段的结构中使用。
这意味着在以下结构中,不需要填充:
struct Example {
void* pointer;
HALF_PTR one;
HALF_PTR two;
};
当然,这仅在HALF_PTR 的大小(64 位系统上为 32 位,32 位系统上为 16 位)足以容纳预期值时才相关。
【讨论】:
sizeof(struct Example) 是2*sizeof(void*)。这里不需要工会。
HALF_PTR 来访问指针的各个部分——毕竟,将指针分成两部分可以获得什么?我认为引用表示的用法类似于我的示例中的用法。
注意:匿名结构不是标准的,但 MSVC 采用它们:
union
{
int * aPointer
struct
{
HALF_PTR lowerBits;
HALF_PTR upperBits;
};
} myvar; //You can be assured this union is sizeof(int *)
如果您认为它们不是非常有用,那您是对的。
【讨论】: