使用GLuint相对于unsigned int有什么优势?

37

我希望尽可能地让我的代码更加标准化,那么为什么我要将我的类成员定义为OpenGL类型而不是使用基本类型呢?这样做有何优势吗?

3个回答

56

“unsigned int”类型的大小取决于您正在构建的平台。我预计这通常是32位,但它可能是16或64(或其他某些值 - 取决于平台)。

库特定的类型通常根据平台特定规则创建为typedef。这使得通用应用程序可以使用正确的类型,而无需了解将要构建的平台。相反,平台特定的知识被限制在单个公共头文件中。


3

在这种情况下,我认为这并不重要,因为规范指定它们是最小尺寸,而不是严格尺寸。请查看gl.h ~第149行,它们只是基本C类型的typedefs。它们只是一种方便 - 例如有一个布尔类型,因此如果您使用C89并且不使用任何布尔值,则有一个设置供您在GL中使用。GLuint只是输入unsigned int的更短方式:

typedef unsigned int  GLenum;
typedef unsigned char GLboolean;
typedef unsigned int  GLbitfield;
typedef void    GLvoid;
typedef signed char GLbyte;   /* 1-byte signed */
typedef short   GLshort;  /* 2-byte signed */
typedef int   GLint;    /* 4-byte signed */
typedef unsigned char GLubyte;  /* 1-byte unsigned */
typedef unsigned short  GLushort; /* 2-byte unsigned */
typedef unsigned int  GLuint;   /* 4-byte unsigned */
typedef int   GLsizei;  /* 4-byte signed */
typedef float   GLfloat;  /* single precision float */
typedef float   GLclampf; /* single precision float in [0,1] */
typedef double    GLdouble; /* double precision float */
typedef double    GLclampd; /* double precision float in [0,1] */

2
这在你特定的OpenGL实现上可能是正确的,但一旦你转换到unsigned int不是4个字节的平台,你的代码可能会停止工作。 - ComicSansMS
3
请查看规范(PDF)(表2.2):例如,一个GLuint需要至少32位的大小,而ISO C++标准仅要求C ++的unsigned int至少16位。 规范明确指出:GL类型不是C类型。 因此,例如,GL类型int在本文档之外被称为GLint,并且不一定等同于C类型int。 - ComicSansMS
1
很有趣,但是typedef并没有提供任何保护 - 这只意味着如果您使用非常非常古老的计算机,则可能无法正常工作。您错过了引用下面部分的那一部分,其中写着“不需要正确解释最小范围之外的整数值”。 - user2978842
1
不,typedef 是由您的平台提供的东西。在不同的平台上,您将使用具有满足要求的 typedef 的不同 gl.h。OpenGL 实现在平台之间不可移植。例如,您不能使用 Windows SDK 中的 gl.h 在 Linux 上进行编译。 - ComicSansMS
你需要使用16位架构才能不符合最低要求表。 - user2978842
显示剩余4条评论

1
更好的跨平台兼容性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接