2012-07-30 79 views
2

根據這裏的一些帖子(Efficiency of std::copy vs memcpy),std :: copy應該被壓縮到一個pod類型的memcpy/memmove。我試圖測試,但我不能複製結果。編譯器將std :: copy複製到memcpy(memmove)的條件是什麼

我使用Visual Studio 2010和我嘗試了所有的優化級別

struct pod_ 
{ 
     unsigned int v1 ,v2 ,v3 ; 
} ; 

typedef pod_ T ; 
static_assert(std::is_pod<pod_>::value, "Struct must be a POD type"); 


const unsigned int size = 20*1024*1024/sizeof(T); 
std::vector<T> buffer1(size) ; 
std::vector<T> buffer2((size)) ; 

而且我想這:

std::copy(buffer1.begin(),buffer1.end(),&buffer2[0]); 
0030109C mov   esi,dword ptr [esp+14h] 
003010A0 mov   ecx,dword ptr [esp+18h] 
003010A4 mov   edi,dword ptr [esp+24h] 
003010A8 mov   eax,esi 
003010AA cmp   esi,ecx 
003010AC je   main+8Eh (3010CEh) 
003010AE mov   edx,edi 
003010B0 sub   edx,esi 
003010B2 mov   ebx,dword ptr [eax] 
003010B4 mov   dword ptr [edx+eax],ebx 
003010B7 mov   ebx,dword ptr [eax+4] 
003010BA mov   dword ptr [edx+eax+4],ebx 
003010BE mov   ebx,dword ptr [eax+8] 
003010C1 mov   dword ptr [edx+eax+8],ebx 
003010C5 add   eax,0Ch 
003010C8 cmp   eax,ecx 
003010CA jne   main+72h (3010B2h) 
003010CC xor   ebx,ebx 

鑄造於基本類型似乎工作。

std::copy((char *)&buffer1[0],(char *)&buffer1[buffer1.size() - 1],(char *)&buffer2[0]); 
003010CE sub   ecx,esi 
003010D0 mov   eax,2AAAAAABh 
003010D5 imul  ecx 
003010D7 sar   edx,1 
003010D9 mov   eax,edx 
003010DB shr   eax,1Fh 
003010DE add   eax,edx 
003010E0 lea   eax,[eax+eax*2] 
003010E3 lea   ecx,[eax*4-0Ch] 
003010EA push  ecx 
003010EB push  esi 
003010EC push  edi 
003010ED call  dword ptr [__imp__memmove (3020B0h)] 
003010F3 add   esp,0Ch 
+3

條件是,標準庫實現者不屑於優化這一點。 ;)雖然可以使用快速'std :: is_pod '標籤分發來完成。 – Xeo 2012-07-30 05:45:34

+2

你沒有演員試試嗎? ('buffer.begin()'與'&buffer [0]'不一樣)。 – 2012-07-30 05:49:08

+3

'std :: is_trivially_copyable'是C++ 11的標準。 – 2012-07-30 06:08:16

回答

1

您發佈的帖子中的「答案」是錯誤的。一般來說,我期望 std::copymemcpymemmove(因爲它 是更專業)更有效的POD類型。在使用 迭代器時,是否出現這種情況取決於編譯器,但是任何優化都取決於編譯器能夠「透視」迭代器的 。根據 編譯器和庫的實現,這可能不是 。

還要注意你的測試代碼有未定義的行爲。一個用於使用std::copy(和memcpy)的 要求之一是 目的地不是在源範圍([first,last)std::copy[source,source+n)memcpy)。如果源和目標重疊,則行爲不確定。

+0

buffer1和buffer2不同,源/目的地將如何重疊? – GreyGeek 2012-07-30 13:22:48

+0

@GreyGeek對不起,我剛看到'buffer'(和'memmove'的引用,這表明有重疊)。 – 2012-07-30 15:09:42

相關問題