2013-10-25 70 views
2

將整數數組初始化爲給定值的最快方法是什麼?C++中最快的數組初始化

如果我有字符數組,我可以用memset的:

char a[N]; 
memset(a, value, N); 

我不能這樣做,如果數組類型memset的=字符和值= 0或-1:!

int a[N]; 
memset(a, value, N*sizeof(int)); // INCORRECT! 

所以我想知道是否有辦法爲其他數組類型進行類似的內存初始化。

+1

'int x [] = {1,2,3,4}'。 –

+1

最快的方法?在你的代碼中有一個數據塊(在它之前有一個跳轉語句),並將你的數組指向它。但嚴重的是,保持標準:使用'std :: fill' – Bathsheba

+0

「我輸入最快的東西」或「最快的速度」是最快的?如果後者是數組初始化速度*真的*是你的代碼中的一個瓶頸?如果是這樣(我覺得這不太可能),你應該重新構建你的代碼。 –

回答

7

使用std::fill

char a[N]; 
std::fill(std::begin(a), std::end(a), value); 

注意std::beginstd::end被定義爲C++ 11。

如果您使用C++ 03,那麼這會工作:

char a[N]; 
std::fill(a, a + N, value); 
+0

mfontanini,謝謝! – klm123

+0

我得到的錯誤:'開始'不是'std'的成員 – klm123

+0

即使#include klm123

0

我想你可以使用任何原始類型的memset。

int a[N] 
memset(a, '0x00', N * sizeof (int)) 
+0

這不符合http://www.cplusplus.com/reference/cstring/memcpy/ – klm123

+1

如果該值爲零,那麼很可能(但不能保證)能夠工作,但對其他值不起作用。 –

+0

我明白了。我錯了.. – Qwerty

1

不可能有什麼比集合初始化速度快:

int x = {1,2,3,4,5,6}; 

如果你想要的一切初始化零,那麼你可以利用語法來初始化整個數組:

int x [50] = {}; 

這是不同的比:

int x[50]; 

因爲當你指定一個初始值設定項時,未初始化的元素會被初始化。如果您不指定初始化程序,那麼這些元素是未初始化的。

僅僅因爲不可能有比int x[] = {....}更快的方法,所以其他方法不一定是慢的。您需要在您的實際平臺上以發佈模式進行配置,以便確切知道。

0

你可以memset任何類型的對象/原語。畢竟一切都存儲在內存中。

這就是說,你必須瞭解你的編譯器和處理器如何存儲你想要預測的結果。如果做錯了,這是非常不便攜和危險的。

現代桌面處理器的很多性能取決於您所引用的對象是否在緩存中。所以很難說它是否會更快。所有其他事情都可能會更快。