2016-10-22 67 views
0

你好,我已經看到了這個Maximum size of local array variable,但我想知道爲什麼這是好的,如果數組設置離子全局和不好,如果它後面的主。本地數組變量exc壞acces分段&本地或全局?

而關係中的另一個問題: 在a.cpp中定義大的內存對象並使用extern在a.hpp中聲明是否是一種很好的做法?或者更好地處理在本地函數中定義的大內存,但定義爲vector或new或malloc並將它們傳遞給函數參數。

這是看我的經驗,是這些問題,我必須解決......

謝謝

#include <iostream> 
using namespace std; 

#define N (10000000000000) 
int sd[N]; 

int main() { 
    // int sd[N]; 
    return 0; 
} 
+0

當你有非常大的或未知大小的數組,你要利用堆。 – amanuel2

+2

改爲使用'std:vector '。 –

+0

您的本地變量的例程分配在堆棧上,預計相對較小。全局變量(過分簡化)分配在堆上,默認情況下這是一個更大的空間。您的變量也可以通過使用new()或malloc()使用本地例程中的堆空間進行分配,但是當函數退出時,用於引用這些變量的指針可能超出範圍,從而導致內存泄漏,除非您首先使用delete()或free()取消分配內存。 – mikeTronix

回答

0

聲明在全局範圍:

int sd[N]; 

int main() { 
    return 0; 
} 

產生的二進制只是得到真正的大。當進程中加載​​到內存中,全局內存整個數據集的映射

聲明的函數中:

int main() { 
    int sd[N]; 
    return 0; 
} 

而作爲調用的內存一旦分配的功能 - 這是。從堆棧分配。線程的堆棧內存通常初始化爲低,接近兆字節或更低。一旦堆棧內存用完,遊戲就結束了。

正如其他人在評論中指出的那樣,分配大數組的正確方法是動態使用堆內存,這通常很豐富。

int main() { 
    int* sd = new int[N]; 

    ... 

    delete [] sd; // free the allocated memory 
    return 0; 
} 

更妙的是,這樣你就不必記住刪除:

int main() { 
    std::vector<int> sd(N); 

    ... 

} 
+0

http://stackoverflow.com/questions/40202324/c-vector-appear比數組快的速度 - 爲什麼 – user7058377

+0

爲什麼矢量速度比c數組快? – user7058377

+0

@ user7058377:容器速度不夠快。個人操作緩慢或快速。而你只關心速度的時候和**,如果**你實際上已經經歷過某些東西太慢了。在此之前,您使用正確的工具。 'std :: vector '肯定是這裏的正確工具。 –