簡體   English   中英

C/C++ 分配

[英]C/C++ Allocation

給出一個數字X並將X個數字讀入一維數組,以下哪種方式最好(執行時間最快)?

請注意 X 是 1 到 1000000 之間的數字

scanf("%d", &x);
int array[x];
//continue reading X numbers into array

或者

scanf("%d", &x);
int array[1000000];
//continue reading X ...

或者

scanf("%d", &x);
int * array = malloc(x*sizeof(int));
//same as above
free(array);

還是C++動態分配方法?

注意 1:我是從手機上發布的,我希望上面代碼的格式沒問題,如果沒有,我會請人(<3)編輯它,因為從手機中縮進代碼很痛苦。

注 2:我如何測試我上面提出的問題?

您將收到此代碼的編譯錯誤:

scanf("%d", &x);
int array[x];

在這種情況下,應該在編譯時知道 x。

使用int array[1000000]您在堆棧上分配內存,而不是在堆中,因此與mallocnew operator相比,這是根本區別。 它會更快,因為它實際上只需要一個 CPU 命令來修改堆棧指針。

如果比較mallocnewmalloc會更快,因為 new 最終會在內部調用malloc 但是性能提升會很小,用這種方式優化你的c++程序是不值得的,只需要在需要分配動態內存時使用c++。

由於出現scanf (並且評論假設還有一百萬次調用scanf )關於內存分配以及“哪個最快?”的任何問題。 可以普遍回答:“是”(讀作:無關緊要)。

雖然自動存儲(“堆棧分配”)通常比 freestore 快,但與您將在scanf花費的時間相比,它完全微不足道。 話雖如此,它通常(不一定,但通常)是緩慢的動態釋放,而不是分配。

關於該代碼,一般需要注意幾點:

  1. 從某個外部源(文件、網絡、argv 等)讀取一個整數並根據該數字進行分配而不先進行完整性檢查是非常糟糕的業力。 這總有一天會引起一個問題,那就是有多少現有的現實世界的漏洞應運而生。 不要盲目相信您從某處獲得的任何號碼都是自動有效的。 即使沒有惡意,事故仍然可能提供一個無效的數字,這將導致災難性的故障。
  2. 在堆棧上分配一個非常量大小的數組將在最新版本的 C 下工作,並且如果您使用 GCC,即使在 C++ 下也可以作為擴展“工作”,但在 C++ 中通常是不允許的(這意味着它將無法編譯)。
  3. 分配一百萬個整數意味着大約 4MB 的內存,這對您的最大堆棧大小(通常只有 1MB)來說非常苛刻。 預計會發生堆棧溢出
  4. 分配未知數量的整數(但預計數量最多可達一百萬)類似於(3)。
  5. re (3) 和 (4) 最糟糕的是它實際上可能會成功 這可能意味着您的程序稍后會意外崩潰(遇到堆棧溢出),在一段完全無關的無辜代碼中。 您會想知道為什么會發生這種情況,因為崩潰的代碼看起來完全有效(而且確實如此!)。

暫無
暫無

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

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