为什么我们使用 glfwCreateWindow 的指针? - OpenGL

Why do we use pointers for glfwCreateWindow? - OpenGL

本文关键字:指针 OpenGL glfwCreateWindow 我们 为什么      更新时间:2023-10-16

我目前正在学习OpenGL,我对C++也很陌生。我的问题是为什么在这里使用指针。

GLFWwindow *mainWindow = glfwCreateWindow(WIDTH, HEIGHT, "Test Window", NULL, NULL);

我明白指针是什么,只是不知道为什么在这里使用它们。感谢所有答案,谢谢。

glfwCreateWindow()返回指向窗口的指针而不是实际窗口没有内在必要性。OpenGL库可能被设计成使代码看起来不同,例如:

GLFWwindow mainWindow = glfwCreateWindow(WIDTH, HEIGHT, "Test Window", nullptr, nullptr);

或者实际上,仅使用GLFWindow的构造:

GLFWwindow mainWindow { WIDTH, HEIGHT, "Test Window", nullptr, nullptr }; 

尽管如此,API 以这种方式设计有几个可能的原因:

  1. 直到 2017 年 C++,编译器不需要执行 RVO - 返回值优化。这意味着如果你的函数返回一个类型为T的值,理论上你可能需要将你在函数中创建的T复制到调用函数的代码的目标位置。在您的情况下 - 返回GLFWwindow可能需要复制GLFWwindow;这对库来说可能是个问题(我不知道 OpenGL,所以我不知道(。
  2. 当你的函数返回一个T*时,指向的对象可以是任何"是T"的东西 - 这意味着从T(!(继承的任何类型;而如果你返回一个普通T- 你不能返回继承类型。因此,如果存在GLFWwindow的类层次结构,并且所有类都继承自GLFWwindow作为基类 - 返回指向该基类的指针是有意义的,以便您进行一般处理。

PS - 有五个构造函数参数,并且传递参数使得设置的构造函数参数相当不清楚,这是有问题的设计。具体来说 - 我们无法说出第一个nullptr的含义,也无法说它与第二个nullptr有何不同.

  1. 您需要直接引用窗口才能对其进行更改。
  2. 如果它返回一个C++结构,并且结构的定义是这样的:
struct someStructure{
int width;
int length;
string name;
//some more variables
}

然后在将此结构传递给任何函数/方法时 - 您将传递
[ sizeof(int( + sizeof(int( + sizeof(string( +...+ sizeof(int(] 字节的数据 - 也就是说 64 字节(当您修改/更改结构时,它也会随着时间的推移而增加

但是,如果您传递指针引用,它只会发送一个地址(8 位/16 位/32 位等(,这取决于您的系统寻址方案,它将是固定的,即使您将来向结构添加更多成员也不会更改。