c 效能深度挖掘 陣列使用及配套測試記錄

2021-09-25 06:10:22 字數 1725 閱讀 2113

前言:陣列是我們儲存資料最常用的資料結構,如通訊中傳送和接收大量16進製制資料;儲存需要處理的時序資料等。陣列的型別是多種多樣的,如16進製制型別,int型別,float或double型別(按照資料最大值範圍還可加字首short和long),字串型別。陣列也需要初始化為零或者其他,否則演算法可能出錯。有時也需要我們新建乙個動態變化長度的陣列。

基礎1:新建乙個一維陣列

定義的一般形式為:型別 陣列名[常量表示式];

例子:float num[100];

*不允許對陣列的大小做動態定義,常量表示式不可以包含變數。

*陣列線性儲存,下標從0開始,因此使用時是num[0],num[1],……等方式。

*陣列定義不初始化會隨機賦值,初始化為0的方法,float num[100]=。或者memset(num,0,sizeof(num));這樣可以初始化為任意的數,不僅是0。memset在標頭檔案string.h裡, 據說這樣最快,我後期會測試一次。 ok,我更正一下,memset只對char型別有效,難怪在string.h裡面。

從後續的測試結果來看,對於初始化為0的方法,直接定義時初始化和使用memset函式初始化效率差不多,而使用迴圈則速度差距非常大,大概有10倍的差距吧!所以盡量用記憶體操作的方式初始化。

基礎2:新建乙個二維陣列

定義的一般形式為:型別 陣列名[常量表示式][常量表示式];

例子:float num[100][100];

*資料的儲存形式,a[0][0]->a[0][1]->a[0][2]->……->a[1][0]->a[1][1]->……

*賦初始值,int a[3][4]=,,};等號右邊每乙個花括號內的花括號都代表一行,按照順序賦值,其餘賦值為0.

基礎3:新建乙個字元陣列(字元陣列和字串是不一樣的概念)

定義的一般形式為:char ch[6];

ps: 這裡解釋一下字串,字串是雙引號括起來的字串行,約定字串的末尾以轉義字元""作為結束標誌。

使用字串初始化:char ch[5]="abcd";

*乙個長度固定的字元陣列可以存放不同長度的字串。但由於字串末尾有乙個結束字元,所以得注意字元數實際長度是雙引號內字元+1.

配套測試**:

測試時經驗總結:

1.陣列長度超過1百萬,不能儲存在棧上,容易記憶體溢位。存為全域性變數,存在堆上;

記憶體分為棧記憶體,堆記憶體,全域性區,常量區,**區。

棧記憶體儲存的都是區域性變數。由作業系統管理,程式一旦離開作用域,就會釋放變數。棧的大小有限制,常見的是1m或2m大小,因此非常容易超出;

堆記憶體儲存的是物件,凡是new建立的都在堆中,堆內的資料由使用者釋放。堆的大小基本無限制,但得注意釋放記憶體。

全域性區儲存的是全域性變數和靜態變數。

2.記憶體直接操作,是比賦值快的,使用迴圈的方式賦值,速度顯著的慢;

函式有memcpy(),memmove(),memset()

void *memcpy(void *dst,void const *src,size_t length)

void *memmove(void *dst,void const *src,size_t length),效率慢於memcpy,但可以處理拷貝的兩端記憶體重疊的問題。

void *memset(void *a,int ch,size_t length),把從a開始的length個位元組設定成字元值ch,可以初始化字元陣列。

結果顯示,操作記憶體也沒快多少,快了1ms左右。

全域性陣列怎麼定義 c 陣列使用 配套測試記錄

測試時經驗總結 1.陣列長度超過1百萬,不能儲存在棧上,容易記憶體溢位。存為全域性變數,存在堆上 記憶體分為棧記憶體,堆記憶體,全域性區,常量區,區。棧記憶體儲存的都是區域性變數。由作業系統管理,程式一旦離開作用域,就會釋放變數。棧的大小有限制,常見的是1m或2m大小,因此非常容易超出 堆記憶體儲存...

C 陣列中的 indexOf 方法及使用

具體 如下所示 var array reg 2018 2018 array.indexof reg 0 array.indexof r 1 array.indexof 2018 1 array.indexof 2018 1 arr.indexof orange 輸出 0 因為 orange 是陣列的...

c 二維陣列賦值及二維指標使用

include void main int tmp 2 test printf value d n tmp 0 printf value d n tmp 0 printf value d n tmp 1 printf value d n tmp 1 printf value d n tmp 0 1 ...