为什么程序员在OpenGL中使用常量和静态变量?

为什么程序员在OpenGL中使用常量和静态变量?,opengl,static,constants,Opengl,Static,Constants,我注意到程序员会使变量const和static。我理解这些关键词的作用,但我不知道它们为什么使用它们 示例1 如果这些数组只在这个单一对象实例中使用,为什么它们必须是静态的呢 例2 fs_源字符数组在设置后不会更改。但绝对有必要让它保持不变吗?它会提高性能吗?是的,通常情况下,它会提高性能,尽管不一定是以您想象的方式 有了这些提示,编译器可以自由地选择不同的优化(空间和时间),从而使代码在这个过程中更加高效 例如,静态存储持续时间变量(a)在程序启动时初始化一次,并且不必再次初始化 将某

我注意到程序员会使变量
const
static
。我理解这些关键词的作用,但我不知道它们为什么使用它们


示例1

如果这些数组只在这个单一对象实例中使用,为什么它们必须是静态的呢


例2

fs_源字符数组在设置后不会更改。但绝对有必要让它保持不变吗?它会提高性能吗?

是的,通常情况下,它会提高性能,尽管不一定是以您想象的方式

有了这些提示,编译器可以自由地选择不同的优化(空间和时间),从而使代码在这个过程中更加高效

例如,静态存储持续时间变量(a)在程序启动时初始化一次,并且不必再次初始化

将某些内容标记为
const
可以让编译器生成更高效的代码,同时充分了解数据不会更改。作为一个极端的例子,它可以将值加载到专用的CPU寄存器中,并且不再查看内存中的数据

因此,是的,它可以提高性能,这不是因为相同的指令可能运行得更快,而是因为编译器可以根据您提供的额外知识自由使用不同的指令


(a) :假设这就是您对
static
的含义。关键字还用于限制其可见性范围,这是一种良好的编程实践

我理解这些关键词的作用

你知道吗

但我不知道他们为什么用它们

是吗

如果这些数组只在这个单一对象实例中使用,为什么它们必须是静态的呢

什么东西?什么例子?你引用的这个例子是用C写的,而不是C++,尽管用C实现对象和实例是完全可能的,但是语言本身并没有定义内置的对象。因此,我认为你关于静电在这种情况下的作用的想法是错误的

在给定的示例中,如果在模块级别应用了static,则将其应用于全局变量。这样做的效果是,该变量仅对定义它的编译单元可见。在C程序中,声明所有不在当前编译单元之外引用的静态内容是一种常见且推荐的做法

在函数范围内使用静态on常量数据可以节省每次调用函数时对变量进行完整初始化的开销

fs_源字符数组在设置后不会更改

而你却不能。C语言指定,不属于字符数组初始化的字符串文字类型为
const char*
,并驻留在程序映像的专用只读段中。由于非初始值设定项字符串文字的类型是
const char*
将这样的指针变量分配给
char*
会调用未定义的行为

但绝对有必要让它保持不变吗


尝试删除常量并使用
-Werr
编译程序时会发生什么情况。这实际上是语言正确性的问题。

在我们讨论的文件varray.c(示例1)中:

示例中的静态不是在模块级别声明的,它们的可见性仅在函数内部。
static
关键字在不同的时间可能意味着不同的事情,但在这种情况下,它并不是限制它们从其他代码文件的可访问性(而是限制它们的作用范围,使其仅在发生任何情况时才起作用)

这些数组在程序运行期间仅声明/生成一次。在这些声明之前添加static关键字(比如在setupPointers中)意味着这些代码行(59-64、65-70)只执行一次,指针本身不会改变,并且这些数字不必再次“流经管道”(参见上面的答案“重新性能”),因为它们已经存在

这是因为当用户单击鼠标按钮时,程序会在两个绘图例程之间切换。只初始化数组一次是有意义的,而不是每次调用
setupPointers
函数时都初始化数组

是的,这是
static
关键字工作的方式之一,它告诉编译器只初始化这个变量一次
const与之类似,但它的意思更像是“只向该内存写入一次”

你可能会说,为什么不让它们成为常量呢?我知道,对吧

也许这些链接将帮助人们:


如果你将一个统一的静态常数作为基础,它是否仍然只计算一次,而不是针对每个顶点和片段?
    static GLint vertices[] = {25, 25,
                              100, 325,
                              175, 25,
                              175, 325,
                              250, 25,
                              325, 325};

    static GLfloat colors[] = {1.0, 0.2, 0.2,
                              0.2, 0.2, 1.0,
                              0.8, 1.0, 0.2,
                              0.75, 0.75, 0.75,
                              0.35, 0.35, 0.35,
                              0.5, 0.5, 0.5};

    glEnableClientState (GL_COLOR_ARRAY);
    glEnableClientState (GL_VERTEX_ARRAY);

    glColorPointer (3, GL_FLOAT, 0, colors);
    glVertexPointer (2, GL_INT, 0, vertices);
    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);

    const char *fs_source =
    "#version 120           \n"
    "void main(void) {        "
    "  gl_FragColor[0] = 0.0; "
    "  gl_FragColor[1] = 0.0; "
    "  gl_FragColor[2] = 1.0; "
    "}";

    glShaderSource(fs, 1, &fs_source, NULL);