簡體   English   中英

難以理解C中的內存分配

[英]Difficulty understanding memory allocation in C

我試圖了解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之前,它仍然還必須將數字存儲為雙精度嗎?

當int函數執行計算時,在返回int之前,它仍然還必須將數字存儲為雙精度嗎?

這個問題似乎假設以下行的結果:

return sum/size;

總是浮點數。 但是這個假設是錯誤的。 例如看

C11(草案N1570),第6.5.6 p6節

當整數相除時, /運算符的結果是代數商,其中舍棄了任何小數部分。

因此,如果兩個操作數都為整數類型,則只得到一個整數除法 ,結果為整數類型,在您的示例int (其值僅丟棄任何小數部分)。


在另一個函數中,一個操作數已經是double 看一下

C11(N1570草稿)§6.3.1.8p1

[...]
否則,如果一個操作數的相應實型為double ,則另一個操作數將在不更改類型域的情況下轉換為其相應實型為double類型。

因此,在這種情況下,您的size隱式轉換為double ,因此/執行浮點除法 ,結果為double

答案取決於

1.您平台上整數的大小(特定於編譯器)。

2.您的編譯器+處理器支持浮點運算的方式。 如果您的處理器沒有FPU,則編譯器可以仿真浮點算法。

考慮以下幾點:

假設您的平台double需要比integer更多的字節: getMean2函數中的堆棧使用量會更多。

假設您的處理器沒有FPU:文本(代碼)段會在getMean2函數中消耗更多的內存。

return sum/size; 將在整數除法getMean1 ,這將是在一個浮點除法getMean2

注意:由於您既沒有動態分配內存,也沒有全局變量,因此data段和heap將不受影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM