我可以一直假设sizeof(GUID)== 16吗?

时间:2011-08-04 22:57:10

标签: windows guid sizeof

Windows标题中GUID的定义如下:

typedef struct _GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 8 ];
} GUID;

但是,没有定义包装。由于结构成员的对齐取决于编译器实现,因此可以认为该结构的大小可能超过16个字节。

如果我可以假设它总是16个字节 - 我使用GUID的代码更高效,更简单。 但是,如果编译器出于某种原因在成员之间添加了一些填充,那将完全不安全。

我的问题存在潜在的原因吗?或者是sizeof(GUID)!= 16实际上是0的场景的概率。

6 个答案:

答案 0 :(得分:3)

这不是官方文档,但也许this article可以缓解你的一些担忧。我认为还有一个关于类似主题的问题,但我现在找不到它。

我想说的是Windows结构确实有一个打包说明符,但它是一个全局设置,它位于头文件中。这是一个#pragma或者其他东西。它是强制性的,因为不同编译器编译的程序不能相互交互 - 甚至与Windows本身交互。

答案 1 :(得分:2)

它不是零,取决于你的系统。如果对齐是基于单词(4字节),则在short之间将有填充,并且大小将超过16。

如果你想确定它是16 - 手动禁用填充,否则使用sizeof,并且不要假设值。

答案 2 :(得分:2)

如果我觉得我需要做出这样的假设,我会在代码中加上'编译时断言'。这样,编译器会告诉我我是否以及何时出错。

如果您已经或者愿意使用Boost,那么可以使用BOOST_STATIC_ASSERT宏来执行此操作。

出于我自己的目的,我使用类似于本文所述的技术拼凑了我自己的(使用C或C ++,使用MSVC,GCC和嵌入式编译器或两个):

让编译时断言干净利落的真正诀窍是处理一些编译器不喜欢与代码混合的声明(C模式下的MSVC)的事实,并且这些技术经常产生警告,你宁愿没有阻塞其他工作的构建。提出避免警告的技术有时是一项挑战。

答案 3 :(得分:1)

任何时候根据别人的结构大小编写代码, 警告应该响起。

您能举例说明您想要使用的一些简化代码吗? 如果需要结构的大小,大多数人只会使用sizeof(GUID)。

据说 - 我看不到GUID的大小在不断变化。

答案 4 :(得分:1)

是的,在任何Windows编译器上。否则IsEqualGUID将不起作用:它只比较前16个字节。类似地,任何其他采用GUID*的WinAPI函数只检查前16个字节。

请注意,您不得假设windows.h的通用C或C ++规则。例如,Windows上的字节总是8位,即使ISO C允许9位。

答案 5 :(得分:0)

#include <stdio.h>
#include <rpc.h>
int main () {
GUID myGUID;
printf("size of GUID is %d\n", sizeof(myGUID));
return 0;
}

得到16.这有助于了解您是否需要在堆上手动分配。