memset與for迴圈賦初值比較

2021-10-17 21:17:21 字數 4451 閱讀 2072

寫**的時候思考了一會兒memset初始化快還是for迴圈初始化快。

看了大量的文獻資料,結論如下:

如果對於乙個陣列進行賦初值操作,memset肯定比for迴圈快

memset賦初值是按位元組為單位的,如果要賦一些比較難的值(33,22等),就比較難

接上,因為memset是按位元組為單位賦初值,當變數所佔位元組數越大,速度越慢(int的陣列比char慢)

測試**如下:

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

using

namespace std::chrono;

const

int maxrownum =

5e3;

const

int maxcolnum =

5e3;

const

int looptimes =10;

const

int loop =10;

int arr[maxrownum]

[maxcolnum]

;int arr0[maxrownum]

[maxcolnum]

;int arr1[maxrownum]

[maxcolnum]

;int arr2[maxrownum]

[maxcolnum]

;int arr3[maxrownum]

[maxcolnum]

;int arr4[maxrownum]

[maxcolnum]

;int arr5[maxrownum]

[maxcolnum]

;int arr6[maxrownum]

[maxcolnum]

;int arr7[maxrownum]

[maxcolnum]

;int arr8[maxrownum]

[maxcolnum]

;int arr9[maxrownum]

[maxcolnum]

;char str0[maxrownum]

[maxcolnum]

;char str1[maxrownum]

[maxcolnum]

;char str2[maxrownum]

[maxcolnum]

;char str3[maxrownum]

[maxcolnum]

;char str4[maxrownum]

[maxcolnum]

;char str5[maxrownum]

[maxcolnum]

;char str6[maxrownum]

[maxcolnum]

;char str7[maxrownum]

[maxcolnum]

;char str8[maxrownum]

[maxcolnum]

;char str9[maxrownum]

[maxcolnum]

;char str[maxrownum]

[maxcolnum]

;long

long

memsetfunc_i()

long

long

memsettenfunc_i()

auto end = system_clock::

now();

auto tt = duration_cast

(end - start)

;return tt.

count()

;}long

long

forfunc_i()

}auto end1 = system_clock::

now();

auto tt1 = duration_cast

(end1 - start1)

;return tt1.

count()

;}long

long

fortenfunc_i()

}}auto end1 = system_clock::

now();

auto tt1 = duration_cast

(end1 - start1)

;return tt1.

count()

;}long

long

memsetfunc_c()

long

long

memsettenfunc_c()

auto end = system_clock::

now();

auto tt = duration_cast

(end - start)

;return tt.

count()

;}long

long

forfunc_c()

}auto end1 = system_clock::

now();

auto tt1 = duration_cast

(end1 - start1)

;return tt1.

count()

;}long

long

fortenfunc_c()

}}auto end1 = system_clock::

now();

auto tt1 = duration_cast

(end1 - start1)

;return tt1.

count()

;}long

long

memsettendifffunc_c()

long

long

fortendifffunc_c()

}auto end1 = system_clock::

now();

auto tt1 = duration_cast

(end1 - start1)

;return tt1.

count()

;}long

long

memsettendifffunc()

long

long

fortendifffunc()

}auto end1 = system_clock::

now();

auto tt1 = duration_cast

(end1 - start1)

;return tt1.

count()

;}vector<

long

long

> ans;

double

getans

(long

long

(*p)()

)sort

(ans.

begin()

,ans.

end())

;double cost =

accumulate

(ans.

begin()

+2, ans.

end()-

2,0.0)

/static_cast

<

double

>

(ans.

size()

-6);

cost = cost/

1000

;return cost;

}int

main()

陣列都開在的棧區,因此陣列不能設的太大。。。

執行結果如下:可以佐證上訴的結論。

memset具體的實現可以看一下下面這個部落格,寫的很仔細:

以大佬的總結作為我的總結:

對陣列使用初始化列表,或 memset 兩者在底層上可能等效。(msvc編譯器將前者處理為後者)。

對陣列用迴圈初始化,和使用 memset 初始化相比,很有可能等效。即使不等效(memset 呼叫了 sse2 擴充套件),也不可能達到成為乙個優化命題和關注點。

如果一定要說有點區別,那就是如果是對乙個整數陣列用初始化列表或者迴圈初始化,那麼編譯器不需要考慮位址對齊的問題(因為編譯器必然把陣列分配到對齊的位址),而 memset 則需要考慮傳入的位址是否已對齊到某個基本粒度,並對此未對齊部分作處理。

當對乙個隨機資料組成的記憶體塊進行清零操作,memset 看起來彷彿是唯一正確的可選方式(如果所在平台無此函式,則可以用手寫迴圈替代)。宣告陣列時提供初始化列表,宣告後再呼叫 memset 或者使用迴圈初始化(顯然,在能夠使用 memset 時,迴圈寫法在高階語言層面不如前者簡潔),無論是**規範還是效能層面,這些寫法都不存在值得強調的絕對優劣關係。

memset函式賦初值問題

我的第一篇部落格。今天寫memset函式的時候遇到了老生常談的話題,這裡沒有出現意料中的1而是16843009。網上查詢了資料後,發現,memset函式是按位元組儲存。語法如下 而char大小是乙個位元組。memset函式其實又稱為char陣列初始化函式,在初始化時對從buffer指標處開始的連續s...

memset函式賦初值問題

今天寫memset函式的時候遇到了老生常談的話題,這裡沒有出現意料中的1而是16843009。網上查詢了資料後,發現,memset函式是按位元組儲存。語法如下 而char大小是乙個位元組。memset函式其實又稱為char陣列初始化函式,在初始化時對從buffer指標處開始的連續size t個位元組...

memset 賦初值為無窮大和無窮小

如果問題中各資料的範圍明確,那麼無窮大的設定不是問題,在不明確的情況下,很多程式設計師都取0x7fffffff作為無窮大,因為這是32 bit int的最大值。如果這個無窮大只用於一般的比較 比如求最小值時min變數的初值 那麼0x7fffffff確實是乙個完美的選擇,但是在更多的情況下,0x7ff...