对于Visual Studio 2010,如果我定义
#define PI 4.0f*atan(1.0f)
在代码后面的某处使用PI
时,是否需要再次计算值,或者只是插入3.1415926?感谢。
修改
因为我听到有人说编译器可能会优化以用3.1415926 ..替换它,具体取决于编译器。
答案 0 :(得分:3)
#define
是一种“复制粘贴”类型的东西。如果您的代码显示std::cout << PI;
,那么编译器会假装您键入std::cout << 4.0f*atan(1.0f);
。
定义的值是不计算直到它们被使用,并且它们在理论上每次使用时都会重新计算。但是,大多数现代编译器都会看到std::cout << 4.0f*atan(1.0f);
并在编译时进行计算,并为std::cout << 3.14159265f;
发出汇编,因此代码与预先计算的速度一样快。
无关,#include
也是复制粘贴的东西,这就是我们需要包含警卫的原因。
答案 1 :(得分:3)
#define
将直接替换文字。因此,只要你PI
,它就会被4.0f*atan(1.0f)
取代。我怀疑编译器会在代码生成过程中对其进行优化,但唯一真正知道的方法是编译它并检查程序集。
我发现这个little online tool将采用c ++代码并生成程序集输出。如果启用优化,您将看到生成的显示PI
的代码已经消失,现在只是一个被引用的常量。
答案 2 :(得分:0)
当预处理器运行时,它会用PI
替换4.0*atan(1.0f)
的每个实例。