难以理解C中的内存分配

时间:2017-08-25 08:27:06

标签: c memory ram

我试图理解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?

2 个答案:

答案 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将不受影响。