根據這裏的一些帖子(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
條件是,標準庫實現者不屑於優化這一點。 ;)雖然可以使用快速'std :: is_pod'標籤分發來完成。 –
Xeo
2012-07-30 05:45:34
你沒有演員試試嗎? ('buffer.begin()'與'&buffer [0]'不一樣)。 – 2012-07-30 05:49:08
'std :: is_trivially_copyable'是C++ 11的標準。 – 2012-07-30 06:08:16