[英]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.