簡體   English   中英

哪種方法在C ++中創建固定長度的數組更好?

[英]Which way is better to create an array of fixed length in C++?

假設我已經知道要創建的數組的大小,那就設為N.

int A[N];
int *A = new int[N];

哪種方法更好/更快? 為什么呢

int a[N];

如果N不是constexpr ,則僅在某些啟用了語言擴展的編譯器或C ++ 14編譯器中是合法的。 (“可變長度數組”)

請注意,這被視為“ C語法”,並且現代的首選方法是:

std::array<int, N> a;

這將在堆棧上創建N整數的數組。 如果N * sizeof(int) > =剩余堆棧大小,則可能有問題。

但是:由於它是本地對象,因此具有自動生存期-當a超出范圍時它將消失。 在堆棧上分配內存也非常便宜。

第二個變體:

int* a = new int[N];

不需要MSVC +語言擴展或C ++ 14編譯器,這會從堆中分配與sizeof(int) * N等價的內存。

它不會自動獲得生存期-完成后,您將需要delete[]內存。 在堆上分配可能很昂貴,尤其是在多線程應用程序中。

在某些情況下,只能在運行時確定程序的內存需求。 然后,您應該使用:

int *A = new int[N];  //it's dynamic memory. Mean it can be change at runtime.

否則,您應該使用:

int A[N];

哪個更快:

int A[N]; 速度更快,因為它可以存儲在運行時堆棧中,並且在進入函數時,它只會將堆棧指針更改為更大的數量來分配空間。

int *A = new int[N]; 速度較慢,因為您必須花時間查找足夠大的連續內存塊。 而且,它不太可能位於計算機存儲的易於訪問的部分。

有關更多信息,請參見此相關的堆棧溢出問題

哪個更好:

至於哪一個總體上“更好”,則取決於具體情況。 有關更多詳細信息,請參見此堆棧溢出問題

編譯時數組:C ++ 11有一個名為std :: array的新容器,如boost :: array,它類似於標准容器,並且可以代替傳統的C數組。
運行時數組:vector是一個不錯的選擇,創建時可以保留其大小。 其他序列容器也可以是數組。

當N很大時,您應該使用動態內存分配,否則它將給出堆棧溢出異常。

暫無
暫無

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

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