为什么我们使用 glfwCreateWindow 的指针? - OpenGL
Why do we use pointers for glfwCreateWindow? - OpenGL
我目前正在学习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 以这种方式设计有几个可能的原因:
- 直到 2017 年 C++,编译器不需要执行 RVO - 返回值优化。这意味着如果你的函数返回一个类型为
T
的值,理论上你可能需要将你在函数中创建的T
复制到调用函数的代码的目标位置。在您的情况下 - 返回GLFWwindow
可能需要复制GLFWwindow
;这对库来说可能是个问题(我不知道 OpenGL,所以我不知道(。 - 当你的函数返回一个
T*
时,指向的对象可以是任何"是T"的东西 - 这意味着从T
(!(继承的任何类型;而如果你返回一个普通T
- 你不能返回继承类型。因此,如果存在GLFWwindow
的类层次结构,并且所有类都继承自GLFWwindow
作为基类 - 返回指向该基类的指针是有意义的,以便您进行一般处理。
PS - 有五个构造函数参数,并且传递参数使得设置的构造函数参数相当不清楚,这是有问题的设计。具体来说 - 我们无法说出第一个nullptr
的含义,也无法说它与第二个nullptr
有何不同.
- 您需要直接引用窗口才能对其进行更改。
- 如果它返回一个C++结构,并且结构的定义是这样的:
struct someStructure{
int width;
int length;
string name;
//some more variables
}
然后在将此结构传递给任何函数/方法时 - 您将传递
[ sizeof(int( + sizeof(int( + sizeof(string( +...+ sizeof(int(] 字节的数据 - 也就是说 64 字节(当您修改/更改结构时,它也会随着时间的推移而增加。
但是,如果您传递指针引用,它只会发送一个地址(8 位/16 位/32 位等(,这取决于您的系统寻址方案,它将是固定的,即使您将来向结构添加更多成员也不会更改。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- OpenGL 统一名称指针作为字符串
- 为什么我们使用 glfwCreateWindow 的指针? - OpenGL
- 使用 QOpenGLWidget 加载 OpenGL 函数指针
- OpenGL:使用指向静态数据的指针数组传递缓冲区数据
- 来自指针向量的OpenGL阵列缓冲区
- 手动检索和存储指向 OpenGL 函数的指针时遇到问题
- OpenGL顶点属性指针或着色器不工作
- OpenGL - 旋转玩家位置以面对鼠标指针
- C++/OpenGL-数组的指针
- 像glColorPointer这样的OpenGL API如何知道作为指针传递的数组的大小
- 为什么OpenGL在创建/释放资源时使用指向资源id的指针
- OpenGL选择缓冲区-使用指向对象的指针而不是Unsigned Int
- OpenGL vbo和指针的问题
- OpenGL什么时候完成函数中的指针