我看过很多关于这个问题的帖子,但是没有一个很好地解释我的担忧,所以我会在这里尝试解释我的理解,如果我错了请纠正我。
假设我有一个包含以下声明的头文件:
//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;
在 header 中定义时,翻译单元可能会也可能不会将值存储在二进制文件的数据部分中。
如果翻译单元中没有代码采用地址或对 fallingTime
的引用,则编译器根本没有理由在数据部分中分配值。编译器可能会用它的值替换 fallingTime
的用法,因为它的定义在编译时在每个翻译单元中都可用。
使用 extern const
生成的代码将不得不从内存中加载 fallingTime
的值,因为它的定义在编译时在任何其他翻译单元中不可用,但一个定义 fallingTime
的值。
关于c++ - C++ 中的 extern 和 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25970038/