对于像PI这样的contants来说,更好的方式是#定义它们或将它们声明为const,这样编译器就可以优化,变得不太容易出错。然而,我想知道,语句中的文字数字是如何处理的?例如:
float x;
const int y = 60;
x = y / 3.0f;
在这个例子中,3.0f是如何处理的?它会继承常量的优化吗?
发布于 2010-08-07 23:43:55
将发生什么优化取决于编译器。在您的例子中,C和C++编译器通常都有足够的信息将您的源代码优化为相同的机器代码。换句话说,它实际上并不太依赖于这段代码中的文字和常量。
话虽如此,在C和C++中,文字和常量这两个术语的含义有很大的不同(并且您同时标记了问题C和C++ )。
C中的
60
是常量,但y
不是常量。如果愿意,可以将y
称为常量限定变量,但在C术语中它不是常量,因为单个y
在C中不是常量表达式。至于字面量,在C语言中,字面量这个术语只适用于字符串字面量(在C99中也适用于复合字面量),也就是说,你的代码中根本没有字面量。
C++中的
60
和3.0.f
都是文字,它们形成常量表达式(分别是整型和浮点型-point )。y
也是int
类型的常量,从某种意义上说,单个y
是C++中的常量表达式。您可能注意到差异的情况与优化无关,而是与语言的定义方式有关。例如,在C++中,在文件范围数组类型声明中使用上述y
是合法的,但在C++中则不合法
typedef int int_array[y]; /* OK in C++, ERROR in C */
发布于 2010-08-07 23:41:20
由于您使用#define
请求预处理器进行文本替换,因此您的代码与以下代码相同:
#define VAL 3.0f
float x;
const int y = 60;
x = y / VAL;
如何优化直接常量值显然取决于编译器。但是,如果您仔细观察汇编代码(例如,由gcc编写的汇编代码),就会注意到编译器直接写入浮点标准中编码3.0的二进制序列。
发布于 2010-08-08 00:24:55
在某些架构上,可以直接使用的字符串大小是有限制的。当字符串文字的大小太大时,编译器需要将常量存储在只读数据内存中的某个位置,然后在需要时从内存中加载值。
如果将值存储在常量变量中,则编译器很有可能只存储常量的一个值并适当地使用。然而,如果一个#定义了常量,这只会使预处理器将文字值放入代码中,因此编译器有可能没有意识到您正在使用相同的值并多次存储常量。正因为如此,常量变量比#定义变量更好。
https://stackoverflow.com/questions/3432478
复制