На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Сравнение данных , различие между == и memcmp
    struct SCompare{
    int i;
    char c;
    void* v;
    long l;
    float f;
    double d;
    };


    Есть простая структура наподобии SCompare.
    Я для сравнения 2х экземпляров структуры использую оператор ==, а вот в чужих искодниках часто встречаю сравнение с помощью memcmp.
    Разница то в чём?
      Вроде бы, чтобы точно сравнивать структуры оператором == , чтобы не было никаких ошибок, нужно явно перегрузить этот оператор, иначе могут быть иногда неточности. Наверное. А функция memcmp сравнивает 2 блока памяти друг с другом, побитно. Это надежнее, особенно когда operator == не перегружен.
      Или нет? smile.gif
        Для POD-типов - ни в чем. Но твой вариант в любом случае лучше, т. к. предустматривает возможность переопределения оператора сравнения для структуры.
          Цитата (KAV @ 9.12.03, 10:36)
          чтобы точно сравнивать структуры оператором == , чтобы не было никаких ошибок, нужно явно перегрузить этот оператор

          несогласен.
          Какие могут быть ошибки при использовании непергруженного оператора ==?
            s1
            {
             ...
             char *pString (0x0ef5ee10) "MyString"
             ...
            }

            s2
            {
             ...
             char *pString (0x0ef7e550) "MyString"
             ...
            }


            Строки одинаковые, т.е. по идее структуры равны, у сравнение == вернет false
            Сообщение отредактировано: Uncle_Bob -
              хм..
              но для таких случаев и перегружают оператор ==.
              Т.е. логическое постоянство обьекта и физическое уже разные вещи...

              Короче, прихожу к выводу, что между неперегруженным оператором == и ф-цией memcmp разницы нет.
                когда объект "сложный", иногда некоторые его данные не имеют значения, скажем его координаты, посему для таких объектов memcmp необъективен.
                  Цитата (Uncle_Bob @ 9.12.03, 16:22)
                  s1
                  {
                   ...
                   char *pString (0x0ef5ee10) "MyString"
                   ...
                  }

                  s2
                  {
                   ...
                   char *pString (0x0ef7e550) "MyString"
                   ...
                  }


                  Строки одинаковые, т.е. по идее структуры равны, у сравнение == вернет false

                  Так тут и memcmp скажет, что не равны структуры

                  Дефолтовый оператор == по сути не отличается от memcmp
                  Сообщение отредактировано: MeG -
                    ИМХО, использование оператора == предпочтительнее, нежели memcpy()... Так как если ты немного изменишь свою структуру и добавишь например указатель, то уже memcpy будет некорректна.. а оператор == всегда мона перегрузить так, чтобы он работал правильно..
                    Тем более может надо делать отборку по каким-либо отдельным данным... в общем, оператор == луче..
                    хотя в дефолтовом представлении, как уже сказали, он то же самое, что и memcpy()...
                      Согласен. Лучше == чем memcpy - просто меньше таблов можно поиметь
                        Что-то вы заговариваться начали. smile.gif Копирование буфера (memcpy) никак не способствуют их сравнению.

                        А оператор== лучше memcmp просто потому, что читается лучше. Гораздо лучше выражает намерение программиста, да и использовать его удобнее. Ну и опять же, как верно заметили, в случае нужды его можно перегрузить.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0370 ]   [ 16 queries used ]   [ Generated: 3.05.24, 08:27 GMT ]