Предпосылка. Рассмотрим такой класс или структуру T, что для двух объектов a и b типа T
memcmp(&a, &b, sizeof(T)) == 0
дает тот же результат, что и
a.member1 == b.member1 && a.member2 == b.member2 && ...
(memberN является нестатической членной переменной T).
Вопрос. Когда следует использовать memcmp для сравнения a и b для равенства, а когда нужно использовать цепочку ==?
Вот простой пример:
struct vector
{
int x, y;
};
Чтобы перегрузить оператор == для vector, есть две возможности (если они гарантированно дают тот же результат):
bool operator==(vector lhs, vector rhs)
{ return lhs.x == rhs.x && lhs.y == rhs.y; }
или
bool operator==(vector lhs, vector rhs)
{ return memcmp(&lhs, &rhs, sizeof(vector)) == 0; }
Теперь, если новый элемент должен быть добавлен в vector, например, компонент z:
- Если для реализации
operator==использовался==, его нужно было бы изменить. - Если вместо этого использовался
memcmp,operator==не нужно было бы изменять вообще.
Но я думаю, что использование прикованного == передает более четкое значение. Хотя для большого T со многими членами memcmp более заманчиво. Кроме того, есть ли улучшение производительности при использовании memcmp over == s? Что еще нужно учитывать?