我试图理解C中内存分配的不同方面。在下面的例子中,我正在计算数组的平均值。我已经定义了一个函数,其中返回值为int = 4
,第二个函数的返回值为double = 4.57
。
#include <stdio.h>
#include <stdlib.h>
int getMean(int arr[], int size);
double getMean2(int arr[], int size);
int main()
{
int mean1;
double mean2;
int array[7] = {1,3,5,7,5,4,7};
mean1 = getMean(array, sizeof(array)/sizeof(array[0]));
printf(" Mean 1 = %d", mean1);
mean2 = getMean2(array, sizeof(array)/sizeof(array[0]));
printf("\n Mean 2 = %.2f", mean2);
return 0;
}
int getMean(int arr[], int size) {
int i;
printf("\n");
int sum = 0;
for (i = 0; i < size; ++i)
{
sum += arr[i];
}
return sum/size;
}
double getMean2(int arr[], int size) {
int i;
printf("\n");
double sum = 0;
for (i = 0; i < size; ++i)
{
sum += arr[i];
}
return sum/size;
}
在函数返回int的情况下,RAM中的内存分配是否仍然与返回double的函数一样?或者它仍然能够使用更少的RAM执行计算?
当int函数执行计算时,在返回int之前是否仍然需要将数字存储为double?
答案 0 :(得分:2)
当int函数执行计算时,在返回int之前是否仍然需要将数字存储为double?
这个问题似乎假设以下行的结果:
return sum/size;
始终是浮点数。但这种假设是错误的。参见例如
C11(草案N1570),§6.5.6第6页:
当整数被分割时,
/
运算符的结果是任意的代数商 分数部分丢弃。
因此,如果两个操作数都具有整数类型,则只需获得整数除法,结果为整数类型,在您的示例中为int
(只有丢弃任何小数部分的值。
在您的其他函数中,一个操作数已经是double
。看看
C11(草案N1570)§6.3.1.8p1:
[...]
否则,如果任一操作数的对应实数类型为double
,则为另一个 操作数在不更改类型域的情况下转换为其类型的类型 相应的实际类型为double
。
因此,在这种情况下,您的size
会隐式转换为double
,因此/
执行浮点除法,结果为{{1 }}
答案 1 :(得分:1)
答案取决于
1.平台上的整数大小(编译器特定)。
2.编译器+处理器支持浮点运算的方式。如果您的处理器没有FPU,则编译器可以模拟浮点运算。
考虑以下几点:
假设您的平台double
需要的字节数多于integer
:
堆栈使用将更多地在getMean2
函数中。
假设您的处理器没有FPU:文本(代码)段将在getMean2
功能中消耗更多内存。
return sum/size;
将是getMean1
中的整数除法,它将是getMean2
注意:
由于您既没有动态分配内存,也没有全局变量,因此data
段和heap
将不受影响。