Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 我可以假设sizeof(GUID)=16吗?_Windows_Guid_Sizeof - Fatal编程技术网

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

Windows 我可以假设sizeof(GUID)=16吗?,windows,guid,sizeof,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的代码更高效、更简单。 然而,如果编译器出于某种原因在成员

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。

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


如果您想确定它是16,请手动禁用填充,否则请使用
sizeof
,不要假设该值。

这不是官方文档,但可能可以缓解您的一些担忧。我想还有一个类似的主题,但我现在找不到


我想说的是,Windows结构确实有一个打包说明符,但它是一个全局设置,位于头文件中的某个位置。这是一个
#pragma
之类的东西。而且它是强制性的,因为否则不同编译器编译的程序无法相互交互,甚至无法与Windows本身交互。

任何时候,只要您编写的代码依赖于其他人的结构大小, 警钟应该响了

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


话虽如此,我看不到GUID的大小在不断变化。

如果我觉得需要这样做,我会在代码中加入一个“编译时断言”。这样,编译器会让我知道我是否错了,何时错了

如果您已经或愿意使用Boost,则有一个执行此操作的
Boost\u STATIC\u ASSERT

<> P>为了我自己的目的,我把我自己的(用C、C++与MSVC、GCC和嵌入式编译器或两个C)结合起来,使用与本文中描述的技术类似的技术:


让编译时断言干净地工作的真正诀窍是处理这样一个事实:一些编译器不喜欢声明与代码混合(C模式下的MSVC),而且这些技术通常会生成警告,您不希望阻塞其他工作的构建。想出避免警告的技术有时是一项挑战。

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

注意,您不能为<代码> Windows .H< /Cord>假定通用C或C++规则。例如,在Windows上,一个字节总是8位,即使ISO C允许9位。

\include
#include <stdio.h>
#include <rpc.h>
int main () {
GUID myGUID;
printf("size of GUID is %d\n", sizeof(myGUID));
return 0;
}
#包括 int main(){ GUID myGUID; printf(“GUID的大小为%d\n”,sizeof(myGUID)); 返回0; }

得了16分。了解是否需要在堆上手动分配是很有用的。

为什么要关心?始终确保安全并使用sizeof()。首先,sizeof()可以在编译时进行计算,其次,如果没有显式指定,就不要指望自己有任何结果。长期以来,人们都希望longint是32位的。现在它在大多数平台和代码中断上都是64位的。人们期待字节的长度,然后想知道为什么字节会被交换。简单地说,不要期望它。C标准没有定义指针的大小。C标准没有定义指针的大小。然而,RFC4122将GUID定义为128位数字。这就是为什么会出现这个问题。此外,如果您查看其他平台,linux/mac上的UUID定义为16字节字符。我现在可以做一个折衷:使代码更加复杂,以处理sizeof(GUID)=16或有简单的代码。在一般情况下,我同意你的意见。然而,guid非常特殊。该类型直接用于RPC结构等。标头中GUID类型的指定稍有不足,这是一个有趣的边界情况。@Shi:
sizeof
不能保证对齐,例如对于SSE。您在做什么,GUID比较可能会对代码的性能产生影响?元素本身可能不会更改,但会从一个平台更改到另一个平台,使用的内存量可能会改变,我也这么认为。但是,这不应该破坏完整的windows api吗?特别是rpcapi。(其中typedefs uuid作为guid。)@JE42-否,因为Windows API在一个系统上,所以所有内容都是一致的,RPC可能会使用流(
ntoh
hton
等)对齐。如果这是官方文档的话。我想到时候一切都会清楚的。没什么大不了的。是Windows SDK的一部分,定义为代码和文档。