我已经看过几篇有关此问题的文章,但没有一篇能很好地说明我的担忧,因此,我将在这里尝试解释我的理解,如果我错了,请纠正我。

假设我有一个带有以下声明的头文件:

//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值的翻译单元外,其他任何翻译单元都无法定义其定义。

09-09 19:06