4

我注意到程序员制作变量conststatic. 我了解这些关键字的作用,但我不知道他们为什么使用它们。


OpenGL 学习官方指南 1.1 版第 2 章的示例 1

    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);

如果这些数组仅用于单个对象实例,为什么它们必须是静态的?


Wikibooks 教程 1 上OpenGL 编程示例 2

    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);

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

4

3 回答 3

4

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

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

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

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

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


(a):假设这就是你的意思static。关键字还用于限制其可见性范围,这是一种很好的编程习惯。

于 2012-08-21T23:04:26.510 回答
4

我了解这些关键字的作用,

你?

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

你?!

如果这些数组只用于这个单一的对象实例,为什么在世界上它们必须是静态的?

什么对象?什么实例?你引用这个例子的书是用 C 语言而不是 C++ 编写的,虽然用 C 语言实现对象和实例是完全可能的,但语言本身并没有内置的定义。因此,我认为你对什么是静态的非常了解在这种情况下确实是错误的。

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

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

fs_source char 数组在设置后不会更改。

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

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

试试如果你去掉const并用-Werr. 这实际上是语言正确性的问题。

于 2012-08-21T23:36:16.980 回答
1

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

示例中的静态变量未在模块级别声明,它们的可见性仅在函数内部。关键字可以在不同的时间表示不同的static东西,但在这种情况下,它不是要限制它们从其他代码文件的可访问性(而是通过将它们的范围限制为仅发生这种情况)。

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

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

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

你可能会说,为什么不把它们设为 const 呢?我知道,对吧?

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

可变数组

关于静态关键字的博客文章

于 2012-08-21T23:39:19.863 回答