VS2010是否预先计算#define定义的预处理器?
Does VS2010 pre-calculate preprocessor defined by #define?
对于Visual Studio 2010,如果我定义
#define PI 4.0f*atan(1.0f)
当代码后面某处使用 PI
时,是否需要重新计算该值,或者只是插入 3.1415926...?谢谢
编辑:
因为我听说有人说编译器可能会优化以将其替换为 3.1415926..,具体取决于编译器。
当预处理器运行时,它会将 PI
的每个实例替换为 4.0*atan(1.0f)
。
#define
是 "copy-paste" 类型的东西。如果您的代码显示 std::cout << PI;
,那么编译器会假装您输入的是 std::cout << 4.0f*atan(1.0f);
。
定义的值在使用前不会计算,并且理论上每次使用时都会重新计算。然而,大多数现代编译器会看到 std::cout << 4.0f*atan(1.0f);
并在编译时进行计算,并会为 std::cout << 3.14159265f;
发出汇编,因此代码的速度与预先计算的一样快。
无关,#include
也是一种复制粘贴的东西,这就是为什么我们需要包含守卫。
#define
将进行直接文本替换。正因为如此,你到处都有 PI
,它将被替换为 4.0f*atan(1.0f)
。我怀疑编译器会在代码生成期间优化它,但唯一真正知道的方法是编译它并检查程序集。
我发现这个 little online tool 将采用 C++ 代码并生成汇编输出。如果打开优化,您会看到为显示 PI
生成的代码消失了,它现在只是一个被引用的常量。
对于Visual Studio 2010,如果我定义
#define PI 4.0f*atan(1.0f)
当代码后面某处使用 PI
时,是否需要重新计算该值,或者只是插入 3.1415926...?谢谢
编辑:
因为我听说有人说编译器可能会优化以将其替换为 3.1415926..,具体取决于编译器。
当预处理器运行时,它会将 PI
的每个实例替换为 4.0*atan(1.0f)
。
#define
是 "copy-paste" 类型的东西。如果您的代码显示 std::cout << PI;
,那么编译器会假装您输入的是 std::cout << 4.0f*atan(1.0f);
。
定义的值在使用前不会计算,并且理论上每次使用时都会重新计算。然而,大多数现代编译器会看到 std::cout << 4.0f*atan(1.0f);
并在编译时进行计算,并会为 std::cout << 3.14159265f;
发出汇编,因此代码的速度与预先计算的一样快。
无关,#include
也是一种复制粘贴的东西,这就是为什么我们需要包含守卫。
#define
将进行直接文本替换。正因为如此,你到处都有 PI
,它将被替换为 4.0f*atan(1.0f)
。我怀疑编译器会在代码生成期间优化它,但唯一真正知道的方法是编译它并检查程序集。
我发现这个 little online tool 将采用 C++ 代码并生成汇编输出。如果打开优化,您会看到为显示 PI
生成的代码消失了,它现在只是一个被引用的常量。