C++中如何動(dòng)態(tài)創(chuàng)建二維數(shù)組 指針數(shù)組與連續(xù)內(nèi)存分配比較

c++++中動(dòng)態(tài)創(chuàng)建二維數(shù)組有兩種常見方法:指針數(shù)組和連續(xù)內(nèi)存分配。1. 指針數(shù)組通過t*實(shí)現(xiàn),先分配行指針數(shù)組,再逐行分配內(nèi)存,靈活但內(nèi)存不連續(xù),適合不規(guī)則數(shù)組;2. 連續(xù)內(nèi)存分配一次性申請(qǐng)rowscols大小的空間,通過計(jì)算索引訪問元素,內(nèi)存連續(xù)利于緩存優(yōu)化,適合性能敏感場(chǎng)景。選擇取決于是否需要每行不同長(zhǎng)度與對(duì)訪問效率的需求,現(xiàn)代c++推薦使用std::vector以避免手動(dòng)管理帶來的風(fēng)險(xiǎn)。

C++中如何動(dòng)態(tài)創(chuàng)建二維數(shù)組 指針數(shù)組與連續(xù)內(nèi)存分配比較

在C++中動(dòng)態(tài)創(chuàng)建二維數(shù)組,常見的方法有兩種:指針數(shù)組和連續(xù)內(nèi)存分配。它們各有優(yōu)缺點(diǎn),適用于不同場(chǎng)景。選擇哪種方式,主要取決于你對(duì)內(nèi)存布局、訪問效率以及代碼維護(hù)性的要求。

C++中如何動(dòng)態(tài)創(chuàng)建二維數(shù)組 指針數(shù)組與連續(xù)內(nèi)存分配比較


指針數(shù)組:靈活但內(nèi)存不連續(xù)

這種方式是通過一個(gè)指向指針的指針(T**)來實(shí)現(xiàn)的二維數(shù)組結(jié)構(gòu)。每個(gè)一級(jí)指針指向一個(gè)獨(dú)立的一維數(shù)組。

C++中如何動(dòng)態(tài)創(chuàng)建二維數(shù)組 指針數(shù)組與連續(xù)內(nèi)存分配比較

實(shí)現(xiàn)步驟:

  • 先為行指針分配空間(即一個(gè)指針數(shù)組)
  • 然后為每一行分別分配內(nèi)存
int rows = 5, cols = 10; int **arr = new int*[rows]; for(int i = 0; i < rows; ++i) {     arr[i] = new int[cols]; }

特點(diǎn)與適用場(chǎng)景:

  • ? 優(yōu)點(diǎn):分配靈活,每行可以不同長(zhǎng)度(適合不規(guī)則數(shù)組)
  • ? 缺點(diǎn)
    • 內(nèi)存不是連續(xù)的,不利于緩存優(yōu)化
    • 分配和釋放都比較繁瑣,容易出錯(cuò)或造成內(nèi)存泄漏
    • 需要多次調(diào)用 new 和 delete[]

釋放時(shí)也要逐行刪除:

立即學(xué)習(xí)C++免費(fèi)學(xué)習(xí)筆記(深入)”;

for(int i = 0; i < rows; ++i) {     delete[] arr[i]; } delete[] arr;

連續(xù)內(nèi)存分配:高效但操作稍復(fù)雜

這種做法是一次性申請(qǐng)一塊連續(xù)的內(nèi)存空間,模擬二維數(shù)組的效果,常用于需要性能優(yōu)化的場(chǎng)景。

C++中如何動(dòng)態(tài)創(chuàng)建二維數(shù)組 指針數(shù)組與連續(xù)內(nèi)存分配比較

實(shí)現(xiàn)方式:

  • 使用單個(gè)指針,通過計(jì)算偏移量訪問元素
  • 或者使用類型別名簡(jiǎn)化訪問方式
int rows = 5, cols = 10; int *arr = new int[rows * cols];

訪問方式:

arr[i * cols + j] = value;

或者更清晰一些的做法:

using Row = int[cols]; // C++11 及以上支持這種方式 Row& arr = *(reinterpret_cast<Row*>(new int[rows * cols])); // 使用 arr[i][j]

特點(diǎn)與適用場(chǎng)景:

  • ? 優(yōu)點(diǎn)
    • 內(nèi)存連續(xù),訪問速度快,利于CPU緩存
    • 只需一次分配和釋放,管理簡(jiǎn)單
  • ? 缺點(diǎn)
    • 行列長(zhǎng)度固定,不能像指針數(shù)組那樣每行不一樣長(zhǎng)
    • 訪問方式略顯麻煩(除非用類型技巧)

釋放也很簡(jiǎn)單:

delete[] arr;

如何選擇?

這要看你的具體需求:

  • 如果你需要靈活性,比如每行長(zhǎng)度可能不同,或者頻繁修改某一行的數(shù)據(jù)結(jié)構(gòu),那應(yīng)該選指針數(shù)組
  • 如果你更關(guān)注性能,尤其是進(jìn)行大量數(shù)值運(yùn)算(如圖像處理、矩陣計(jì)算),那更適合使用連續(xù)內(nèi)存分配

另外,在現(xiàn)代C++中,也可以考慮使用 std::vector<:vector>> 或 std::vector 來代替手動(dòng)管理內(nèi)存,這樣既安全又方便,只是不在本文討論范圍內(nèi)。


基本上就這些。兩種方法都不復(fù)雜,但在實(shí)際使用中很容易因?yàn)榧?xì)節(jié)處理不當(dāng)而引發(fā)問題,比如忘記釋放內(nèi)存或多維數(shù)組越界等。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享