提问人:Zaratruta 提问时间:5/31/2023 更新时间:5/31/2023 访问量:83
就内存和处理时间而言,C 中的文字和变量有什么区别?
What is the difference between literals and variables in C, in terms of memory e processing time?
问:
让我们考虑以下两段代码:
#include <stdio.h>
int main(){
float pi = 3.14;
float r,circumference ;
scanf("%f",&r);
circumference = 2*pi*r;
printf("Circumference:%f\n",circumference );
return 0;
}
在这个中,我将值 3.14 存储在变量 pi 中。
#include <stdio.h>
int main(){
float r,circumference ;
scanf("%f",&r);
circumference = 2*3.14*r;
printf("Circumference:%f\n",circumference );
return 0;
}
在这个中,我直接使用文字值 3.14。
哪一个是最好的选择,为什么? 这两个选项在内存消耗和处理时间方面有什么区别?
答:
哪一个是最好的选择,为什么?这两个选项在内存消耗和处理时间方面有什么区别?
内存消耗和处理时间差别不大。
这是一个计算,是一个,所以第二个可能会花费或多或少的内存和时间。不是因为常数与变量的差异,而是因为类型差异和转换。2*3.14*r;
double
2*pi*r
float
即使更正了示例代码并始终使用相同的浮点类型,差异也很小。节省编码时间以进行更大规模的优化,并让功能良好的编译器进行低级优化。过早的优化真的是万恶之源吗?
为清楚起见,编写代码。
统一使用类型。
使用浮点数。仅当存在令人信服的理由时才使用 。
double
float
long double
#define MY_PI 3.1415926535897932384626433832795
#define MY_PI_F 3.1415926535897932384626433832795f
#define MY_PI_LD 3.1415926535897932384626433832795L
float r = ...
float circumference = 2*MY_PI_F*r;
// or with double
double r = ...
double circumference = 2*MY_PI*r;
请注意,由于类型更改,OP 的 2 个代码在 39.4% 的时间内功能不相同,计算提供了更好的答案。double
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <math.h>
int main() {
unsigned long fi = 0, di = 0;
float pi = 3.14;
for (float r = FLT_MAX; r > 0.0; r = nextafterf(r, 0.0)) {
fi++;
float circumference1 = 2*3.14*r;
float circumference2 = 2*pi*r;
if (circumference1 != circumference2) {
if (di == 0) printf("%.9g %.9g %.9g\n", r, circumference1, circumference2);
di++;
}
}
printf("Differences: %.1f%%\n", 100.0*di/fi);
}
使用时,我发现没有功能差异,但这在 C 中并不确定。 float circumference1 = 2*3.14f*r;
评论
浮点
常量的值?
2*3.14*r
2*3.14f*r
简短的回答是,文字通常比变量更适合记忆。或者由于编译器优化而没有区别。
即时值(又名数字文字)直接存储在指令*中。它存储在代码段中。如果使用变量,则在运行时在堆栈上分配内存。除非编译器优化了该值。
字符串文字以字符数组的形式存储在段中。无论如何,它们都会消耗内存。字符串变量是指针。数组起始地址的值存储在变量中,并在堆栈上分配。.text
如果将字符串文本作为参数传递,则地址的即时值将被推送到堆栈并消耗很少的内存。
如果您想同时获得可读性和内存的优势,您可能希望将宏与 一起使用。它将允许为幻数命名。#define
#define PI 3.14
宏是在预处理器编译之前将由其实际值替换的单词。你可以用它们实现许多有趣的事情。
*取决于架构。例如,在 ARM 中,某些值不能由指令表示,必须存储在只读存储器中。
评论
float
static const float x = 3.14f;
#define foo 3 * 4
foo
3
*
4
char
char
评论
3.14
3.14f
float
double
float
#define
double
double