Предпосылка. Рассмотрим такой класс или структуру 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? Что еще нужно учитывать?