
Michael Kochetkov wrote: ...
int main() { uint8_t d1[16], d2[16]; return memcmp(d1,d2,16); } Here is the result.
$LL4@main: mov esi, DWORD PTR [edx] cmp esi, DWORD PTR [ecx] jne SHORT $LN5@main sub eax, 4 add ecx, 4 add edx, 4 cmp eax, 4 jae SHORT $LL4@main xor eax, eax
Pretty neat.
That's not what I see for the following: int main() { boost::uuids::uuid id1, id2; return memcmp( id1.data, id2.data, 16 ); } even though uuid::data is uint8_t[16]. I see an assembly listing that is virtually identical to the one you posted for _Equal, which is also just a memcmp call: inline bool __CLRCALL_OR_CDECL _Equal(const unsigned char *_First1, const unsigned char *_Last1, const unsigned char *_First2, random_access_iterator_tag, _Range_checked_iterator_tag) { // compare [_First1, _Last1) to [First2, ...), for unsigned chars #if _HAS_ITERATOR_DEBUGGING _DEBUG_RANGE(_First1, _Last1); if (_First1 != _Last1) _DEBUG_POINTER(_First2); #endif /* _HAS_ITERATOR_DEBUGGING */ return (::memcmp(_First1, _First2, _Last1 - _First1) == 0); } I'm using VC++2005 though. Although in both cases, the loop that is actually executed is identical to the one you give above.