【发布时间】:2011-06-06 10:30:44
【问题描述】:
我知道这是每个程序员都应该知道的问题,但我不知道。好久没有C编程了,很多东西都忘记了。
我的问题是:
我在一个头文件中定义了三个巨大的静态数组。有人告诉我,最好在头文件中将它们声明为extern,然后在单个 C 或 C++ 源文件中定义它们。
我该怎么做?
这是我的头文件:
#ifndef _TEMPLE_OBJECT_H_
#define _TEMPLE_OBJECT_H_
#define NUM_TEMPLE_OBJECT_VERTEX 10818
static const float TEMPLEVertices[NUM_TEMPLE_OBJECT_VERTEX * 3] = {...};
static const float TEMPLENormals[NUM_TEMPLE_OBJECT_VERTEX * 3] = {...};
static const float TEMPLETexCoords[NUM_TEMPLE_OBJECT_VERTEX * 3] = {...};
#endif
如果使用 C++ 源文件,是否需要定义一个类?
更新:
我认为问题是:
每个包含这些头文件的源文件(甚至是间接的)都会为这些静态数组生成自己的定义。无法保证编译器/链接器会将它们优化为单个定义,即使在未使用它们的源文件中也是如此。事实上,在许多情况下,编译器无法将它们优化掉。这可能会导致您的静态数据占用大量磁盘空间,并且可能还会占用运行时内存。
谢谢。
【问题讨论】:
-
对于 GCC 和启用优化的构建不应如此。以下是来自 [gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html]https://…" 的“-fkeep-static-consts”的信息“当优化未打开时,即使未引用变量,也会发出声明为静态 const 的变量。GCC 默认启用此选项。如果你想要要强制编译器检查是否引用了变量,无论是否打开优化,请使用 -fno-keep-static-consts 选项。"