【发布时间】:2013-02-15 06:55:23
【问题描述】:
所以我经常看到这样的:
#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;
【问题讨论】:
-
你真的关心你的程序是否多做一个乘法吗?真的那么重要吗?
-
这是一个很好的问题。我曾经问过一个类似的关于内存限制和效率的问题,我认为我收到的标准答案类似于“老实说,按照这个速度,没关系。就是这么少的数据量,效率比没有”不会受到太大的打击。”我想在这种情况下,你会发现程序的效率并不一定会受到 VS 的影响。您每次都可以信任的重新计算的想法。如果你对算术有信心,我会追求纯粹的效率。
-
看,一个好的编译器将even a complete mess like this优化成一个常量...
-
@Smash:嗯,它不太可能成为瓶颈,但如果乘法运算实际上每次都会发生并且它会在一个经常调用的关键循环中使用,那么我看不到为什么不使用其他解决方案之一来确保它不会发生。
-
@plast1K:这是一个常数。每次都重新计算它不会让我不再信任它。
标签: c++ constants c-preprocessor