2016-04-07 62 views
4

wmemcpy似乎執行與memcpy相同的操作,但接受wchar_t*而不是void*。如果這兩個代碼片段應該具有相同的行爲,它的存在是否合理?它有一個有用的目的嗎?當memcpy應該足夠時,wmemcpy爲什麼存在?

memcpy(dest, wchar_array, sizeof(wchar_array)); 

而且

wmemcpy(dest, wchar_array, sizeof(wchar_array)/sizeof(wchar_t)); 
+0

因爲人類喜歡創造的東西...不一定好東西...但是對於一些人來說,只要建立一個巨大的垃圾收集系統就可以讓他們自我價值 – AbstractDissonance

+3

一個弱的原因可能是,當你有一個'wchar_t'數組時,'wmemcpy'可能會更有效,因爲它可以假定合適的對齊方式。 –

+0

@Lashlane'printf(「%zu \ n」,sizeof(wchar_t));'在我的Debian虛擬機中打印4個。 – jdarthenay

回答

1

除了davmac關於API對稱性的答案以及數組的大小並不總是被授予之外,應該強調的是wmemcpy的第三個參數是指要複製的元素數(而不是字節數)。

如果您使用wchar_t對象並使用<wchar.h>中的其他函數處理它們,則可能會有所幫助。 wcslen例如根據wchar_t元素返回C寬字符串長度,並且wcschrwcsrchr返回wchar_t *,因此使用它們來執行一些指針算術也使您處於元素數量的「領域」。

P.S.如果給出最小wchar_t數組的大小爲你的榜樣暗示,使用wmemcpy可能導致更優雅的代碼比你使用的sizeof(wchar_array)

#define SIZE 40 
wchar_t wchar_array[SIZE]; 
// ... 
wmemcpy(dest, wchar_array, SIZE); 
2

我想這主要是關於API對稱,而且,它更容易讓編寫代碼,它可以同寬字符和正常的字符串(工作切換通過預處理器定義或類似)。

本質上,如果您希望您的代碼與char一起使用,那麼您的#define複製功能爲memcpy。對於wchar_t,您將其定義爲wmemcpy。您的尺寸參數僅爲字符數(charwchar_t);請記住,參數不一定是固定大小的數組,因此使用sizeof並不總是一個選項。例如,如果您定義了UNICODE預處理器符號,則大多數函數都會解析爲它們的寬字符版本(後綴爲W),否則它們會解析爲「窄」字符版本(後綴爲A);相應地將TCHAR定義爲charwchar_t;等等。結果就是你可以很容易地編寫適用於寬字符或普通字符的代碼。

當然,這絕不是所必需的;但是,標準的C庫不一定是絕對的最小的。你可能會認爲calloc是多餘的,因爲你總是可以使用malloc,然後memset;但它仍然存在。

+0

我不確定這是否合理,因爲我經常需要像memcpy這樣的東西,像整數或浮點數。爲什麼不用'imemcpy()'或'fmemcpy()'?爲什麼'wchar_t'有自己的功能? 'memcpy'的工作原理是'char'是一個字節,而不是一個字符;雖然'wchar_t'沒有那個特殊的屬性。 – Cornstalks

+0

@Cornstalks但整數和浮動不是(通常)用於保存字符。 'chart'和'wchar_t'都是;它們之間的差異主要在於它們的寬度/範圍。正因爲如此,您可能想要編寫與任一個(或者至少可以切換爲支持)的代碼是有道理的。 – davmac

+1

我想我想說的是,我不認爲'memcpy'是面向字符/字符串。如果是這樣,我希望它採用'char *'而不是'void *'。 – Cornstalks

相關問題