寫**的時候思考了一會兒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...