所有的變數使用到這一點,在本教程中有乙個共同點:該變數必須先宣告在編譯的時候。
這導致了兩個問題:第一,很難有條件地宣告乙個變數,把它在乙個if語句塊之外(在這種情況下,它會超出範圍時,塊的結束)。
第二,所有陣列的大小必須決定在執行程式之前。例如,
以下是不合法的
:
123
45cout << "how many variables do you want? ";
int nvars;
cin >> nvars;
int anarray[nvars]; // wrong! the size of the array must be a constant
然而,在許多情況下,它會有用能的大小或調整陣列並正在執行的程式。例如,我們可能需要使用乙個字串,牽著別人的名字,但我們不知道多久,他們的名字是直到他們進入它。我們可能要在數的記錄從磁碟讀取,但我們事先不知道有多少記錄。或者我們可以建立乙個遊戲,乙個怪物追逐的球員數量可變的。
如果我們不得不宣布一切大小在編譯的時候,我們所能做的就是盡力猜測的最大數量的變數,我們需要和希望的,足夠的:
123
char szname[25]; // let's hope their name is less than 25 chars!
record asrecordarray[500]; // let's hope there are less than 500 records!
monster asmonsterarray[20]; // 20 monsters maximum
這是幾個原因不能解決。首先,它會導致浪費記憶體如果變數實際上並沒有用。例如,如果我們分配25個字元每名稱,但名稱平均只有12個字元長,我們分配在兩次,我們真正需要的!第二,它可以導致人為的限制和/或緩衝區溢位。當使用者試圖在600個記錄從磁碟讀取?因為我們只分配了500的空間,我們可以給使用者乙個錯誤,只看前500條記錄,或(在最壞的情況下,我們根本沒有處理這種情況),我們的記錄,我們的程式緩衝區溢位崩潰。
幸運的是,這些問題是容易解決的問題,通過動態記憶體分配。動態記憶體分配允許我們將任何大小的記憶在我們需要的時候我們需要它。
單變數的動態分配
分配乙個單變數的動態,我們使用標量(非陣列)的新的運算元形式:
1
int *pnvalue = new int; // dynamically allocate an integer
引數的數量,權重的數量
首先我們看第一張圖,可以看出w 1 中有6個引數,w 2 中有4個引數,w 3 中有6個引數,所以整個神經網路中的引數有16個 這裡我們不考慮偏置節點,下同 雖然層數保持不變,但是第二個神經網路的引數數量卻是第乙個神經網路的接近兩倍之多,從而帶來了更好的表示 represention 能力。表示能力...
執行緒的數量
在計算密集型的程式中,最佳執行緒數就是cpu的核數 個數。這是因為在smp 對稱多處理器 環境下,每個cpu都有乙個可執行佇列 run queue 如果乙個程序處於task running狀態 可執行狀態 則它會被加入到其中乙個run queue 且同一時刻僅會被加入到乙個run queue 以便讓...
數量可變的
所有的變數使用到這一點,在本教程中有乙個共同點 該變數必須先宣告在編譯的時候。這導致了兩個問題 第一,很難有條件地宣告乙個變數,把它在乙個if語句塊之外 在這種情況下,它會超出範圍時,塊的結束 第二,所有陣列的大小必須決定在執行程式之前。例如,以下是不合法的 1 2 3 4 5 cout how m...