所以我经常看到这样的事情:
#define gf_PI f32(3.14159265358979323846264338327950288419716939937510)
#define gf_PIhalf f32(3.14159265358979323846264338327950288419716939937510 * 0.5)
这意味着每次在我的代码中使用gf_PIhalf时都会计算一半PI值,对吧? 相反,字面上写下一半PI的值不是更好吗?
执行以下操作会不会更好:
#define gf_PI f32(3.14159265358979323846264338327950288419716939937510)
const float gf_PIHalf = gf_PI * 0.5f; // PIHalf is calculated once
最后这样做是不是最好(为什么它似乎不是常见的做法):
const float gf_PI = 3.14159265358979323846264338327950288419716939937510;
const float gf_PIHalf = gf_PI * 0.5f;
答案 0 :(得分:11)
这意味着每次在我的代码中使用gf_PIhalf时都会计算一半PI值,对吗?
不,不太可能。
你可以合理地指望编译器在编译时进行乘法,而不是运行时。
答案 1 :(得分:3)
您的结论有点正确,除了#define
版本几乎肯定会在编译时解决,而关于类型const全局变量的位是不常见的。它们是现代优良代码中的常见做法。 #define
对于这种用途几乎已经死了。 最佳做法是在未命名的命名空间中定义文件范围全局:
namespace
{
const float g_SomeGlobal = 123.456f;
}
这可以防止翻译单元以外的任何人“看到”g_SomeGlobal
。