【发布时间】:2015-09-10 01:32:09
【问题描述】:
我们的 C 代码库跨两个文件存储所有全局常量:
//global.h
extern const long double ACCELERATION_GRAVITY_FTS;
extern const long double PI;
extern const long double DEG_TO_RAD;
extern const long double RAD_TO_DEG;
extern const long double GC_NM_PER_RAD;
extern const long double FEET_PER_NM;
...
//global.c
const long double ACCELERATION_GRAVITY_FTS = 32.17405;
const long double PI = 3.1415926535897932384626433832795;
const long double DEG_TO_RAD = 0.01745329251994329576923690768489;
const long double RAD_TO_DEG = 57.295779513082320876798154814105;
const long double GC_NM_PER_RAD = 3437.74677471314;
const long double FEET_PER_NM = 6076.1155;
为避免重复,我想将它们重构为一个文件:
//global.h
static const long double ACCELERATION_GRAVITY_FTS = 32.17405;
static const long double PI = 3.1415926535897932384626433832795;
static const long double DEG_TO_RAD = 0.01745329251994329576923690768489;
static const long double RAD_TO_DEG = 57.295779513082320876798154814105;
static const long double GC_NM_PER_RAD = 3437.74677471314;
static const long double FEET_PER_NM = 6076.1155;
//global.c no longer exists
虽然这在可维护性方面显然是一个很好的重构,
对性能和可执行文件大小实用吗?
【问题讨论】:
-
static const方式为编译器提供了用常量表达式替换变量引用的机会。 -
在 C 中,这是一个非常糟糕的主意。这些不是常量,而是常量变量。 IE。它们像变量一样被访问,
const只是程序员不写它们的保证。问题是它们不会被优化,例如作为即时负载。 C方式是将#define它们作为宏,然后使它们成为真正的常量。 -
@CoffeeandCode:我不会在 C 中打赌。这是 C 和 C++ 之间的区别之一。
-
@TrevorHickey:为了确保,您应该尝试一下。 C 不保证这一点;但是,编译器可能会优化,但仅针对
static,而不是跨 CU。 -
@Olaf,好的。不管这种优化是否发生,你都说相反的情况很可能发生。如果使用静态,同一个变量最终可能会多次存储在二进制文件中(因为它存在于包含它的每个翻译单元中)?
标签: c performance static global extern