簡體   English   中英

警告 Integer 運算結果超出范圍

[英]Warning Integer operation result is out of range

f = (double *) malloc(2500000000*sizeof(double));

當我嘗試為這個大尺寸分配 memory 時,它會發出警告“整數運算結果超出范圍”。

根據 C 2018 5.2.4,“環境限制”,有時對於 C 實現來說,事情變得太大而無法處理。 當編譯器告訴你一個 integer 運算結果太大時,這意味着所涉及的數字大於編譯器支持的數量,至少在這種情況下是這樣。

它不能以它使用的 integer 格式表示結果,即使可以,它也幾乎可以肯定不能為您分配那么多 memory。 這將不起作用,您必須使用另一種方法來解決您正在處理的任何問題,即使用較少的 memory。

或者,您可以切換到使用支持更大尺寸的 C 實現,但使用 2.5 億double對象(可能是 200 億字節)即使在支持它的實現中也可能無法正常工作。 在 memory 中保存如此大量的數據會帶來一些問題,但處理這種數據量的程序通常需要考慮到計算硬件和軟件的性能特征,例如尊重物理量 memory可用、memory 緩存的屬性以及系統上的其他工作負載。

多年來,我一直覺得計算機速度太快而無法理解。 如今,他們擁有的 memory 的數量也太大而無法理解。

一方面,是的, 2500000000*sizeof(double)是一個非常大的數字。 按照昨天的標准,應該沒有人能做到 malloc 那么多 memory。

但另一方面,我只是將這個小程序輸入到我膝上已使用了四年的消費級筆記本電腦中:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double *f = malloc(2500000000*sizeof(double));
    unsigned i;
    for(i = 0; i < 2500000000; i++)
        f[i] = 1 + i/1000000000.;
    printf("%f %f %f\n", f[0], f[2500000000/2], f[2500000000-1]);
}

該程序編譯並運行沒有錯誤,按預期打印1.000000 2.250000 3.500000

(可以肯定的是,這台機器的默認編譯器為 x86_64 model 編譯。這段代碼永遠無法在 32 位模式下工作。運行大約需要 40 秒,部分原因是我“只有”16 gig 的 memory這台筆記本電腦,所以陷入困境的可憐的操作系統不得不進入虛擬 memory。)

但是,盡管該程序確實有效,但它絕對處於合理的邊緣。 如果你有一個真正的大而難的問題要解決,有時是蠻力和大量的 memory 是解決它的方法。 但另一方面,有時像這樣的一行

double *f = malloc(2500000000*sizeof(double));

這是一個很好的跡象,表明某些事情沒有被正確考慮。

暫無
暫無

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

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