我已经看过几篇有关此问题的文章,但没有一篇能很好地说明我的担忧,因此,我将在这里尝试解释我的理解,如果我错了,请纠正我。
假设我有一个带有以下声明的头文件:
//definitions.h
extern const float fallingTime;
现在,我有两个要使用此声明的源文件。
//source1.cpp
#include "definitions.h"
const float fallingTime = 0.5f;
//use fallingTime
//source2.cpp
#include "definitions.h"
//just use fallingTime (no definition required)
这就是我要做的;但是现在,假设采用其他方法继续进行。
//definitions.h
const float fallingTime = 0.5f; //Note that I don't use extern now
//source1.cpp
#include "definitions.h"
//just use fallingTime (no definition required)
//source2.cpp
#include "definitions.h"
//just use fallingTime (no definition required)
正如我从阅读多个资源中得出的结论,前一种方法的优势在于它节省了内存和编译时间,因为内存分配仅发生一次(在source1.cpp中的定义中),而在后一种方法中,内存分配发生在每个源中包含definitions.h的文件(source1.cpp和source2.cpp)。那是对的吗?
最后,这意味着要使用extern并同时定义常量吗?会等同于前一种方法吗?
//definitions.h
extern const float fallingTime = 0.5f;
最佳答案
在标题中定义const float fallingTime = 0.5f;
时,转换单元可能会或可能不会将值存储在二进制文件的数据部分中。
如果翻译单元中没有代码使用地址或对fallingTime
的引用,则编译器完全没有理由在数据部分中分配值。编译器可能会用fallingTime
的值替换其用法,因为在编译时每个翻译单元中都可以使用它的定义。
使用extern const
时,生成的代码将必须从内存中加载fallingTime
的值,因为在编译时,除定义fallingTime
值的翻译单元外,其他任何翻译单元都无法定义其定义。