Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Есть-ли приимущество memcpy() перед присваиванием 
:(
    Опции темы
savigm
  Дата 19.2.2010, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



Есть указатель pst на структуру ST и переменная st той-же структуры ST.
Вопрос: что лучше использовать memcpy(pst, &st, sizeof(ST)) или простое присваивание *pst = st?
Просьба ответы аргументировать. 
PM MAIL ICQ   Вверх
baldina
Дата 19.2.2010, 00:27 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



одна фигня.
memcpy(pst, &st, sizeof(ST)) при включенной оптимизации развернется в соотв. инструкции rep movs. присваивание - тоже.
аргументация - погляди результирующий asm

Добавлено @ 00:30
я - за присваивание, т.к.
1. код более читабелен
2. если структура изменится (например, появятся члены-объекты с полноценными конструкторами), компилятор разберется, а за memcpy придется следить самому

Это сообщение отредактировал(а) baldina - 19.2.2010, 00:30
PM MAIL   Вверх
savigm
Дата 19.2.2010, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



Наверное если приимущество есть, его можно только замерить по времени что быстрее копирует и какие обьемы данных. По дизассемблеру вряд-ли что-то скажешь.
PM MAIL ICQ   Вверх
baldina
Дата 19.2.2010, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



savigm
по такому
Код

  t2 = t1;
00401002  mov         ecx,8 
00401007  mov         esi,offset t1 (408048h) 
0040100C  mov         edi,offset t2 (408700h) 
00401011  rep movs    dword ptr [edi],dword ptr [esi] 
  memcpy (&t3, &t1, sizeof(T));
00401013  mov         ecx,8 
00401018  mov         esi,offset t1 (408048h) 
0040101D  mov         edi,offset t3 (408720h) 
00401022  rep movs    dword ptr [edi],dword ptr [esi] 

дизассемблеру недостаточно понятно?
PM MAIL   Вверх
savigm
  Дата 19.2.2010, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



Действительно код идентичен. Что за компилятор?
PM MAIL ICQ   Вверх
baldina
Дата 19.2.2010, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



MSVC 7.1

Добавлено через 54 секунды
в GCC и Intel наверняка будет нечто похожее
PM MAIL   Вверх
mes
Дата 19.2.2010, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(savigm @  18.2.2010,  23:30 Найти цитируемый пост)
Наверное если приимущество есть, его можно только замерить по времени что быстрее копирует и какие обьемы данных.

Преимущество выражено не только временем исполнения.. есть куча других факторов, которые могут иметь (и зачастую имеют) большее значение, особенно с учетом того, что на современных компиляторах высокоуровневые инструкции хорошо оптимизируются и разворачиваются в одинаковый по скорости код, если по сути одинаковы.
smile


Это сообщение отредактировал(а) mes - 19.2.2010, 02:16


--------------------
PM MAIL WWW   Вверх
savigm
  Дата 19.2.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



mes, это вы о каких факторах говорите, разве время копирования не решающий фактор?

Если разницы между memcpy и присваиванием нет, то зачем вообще memcpy существует? Может это пережиток прошлого, когда это был единственный способ копирования структур, т.е. когда присваивания небыло в стандарте Си? 
PM MAIL ICQ   Вверх
baldina
Дата 19.2.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата

Если разницы между memcpy и присваиванием нет, то зачем вообще memcpy существует?

1. разница все-таки есть. присваивание по стандарту осуществляется почленно. для каждого члена вызывается operator=(). семантика присваивания совпадает с семантикой memcpy только для POD типов
2. memcpy это функция стандартной библиотеки C. в С++ существует для совместимости. в С++ имеется std::copy для тех же целей (которая в уместных случаях может вызывать memcpy - так построены многие реализации)
PM MAIL   Вверх
mes
Дата 19.2.2010, 15:18 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(savigm @  19.2.2010,  13:41 Найти цитируемый пост)
это вы о каких факторах говорите, разве время копирования не решающий фактор?

те из которых складывается удобство и безопасность использования, а также (что значительно важней) поддержки конструкции.
при том последнее для memcpy проблематично
Цитата(baldina @  18.2.2010,  23:27 Найти цитируемый пост)
2. если структура изменится (например, появятся члены-объекты с полноценными конструкторами), компилятор разберется, а за memcpy придется следить самому


кстати эта функция обладает еще одним "скрытым" недостатком, которого нет в memmove (ну думаю без пояснения понятно какой, если нет - читать manual по memmove)

чтоб избавиться от этих недостатков
Цитата(baldina @  19.2.2010,  13:58 Найти цитируемый пост)
в С++ имеется std::copy

А нужна для копирования массивов.

Цитата(savigm @  19.2.2010,  13:41 Найти цитируемый пост)
 то зачем вообще memcpy существует? 

memcpy/memmovе для копирования участков памяти (а не объектов)

smile


Это сообщение отредактировал(а) mes - 19.2.2010, 15:46


--------------------
PM MAIL WWW   Вверх
baldina
Дата 19.2.2010, 15:20 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата

mes, это вы о каких факторах говорите, разве время копирования не решающий фактор?

mes молчит, отвечу за него, надеюсь не обидится smile
разработка - многогранный процесс, и далеко не всегда производительность играет решающую роль.
решающую роль обычно имеет совокупность скорости разработки, качества с точки зрения соответствия ТЗ и качества с точки зрения легкости последующей модернизации и сопровождения. для достижения этого код в первую очередь должен быть прост и ясен; все что может проверить или автоматически реализовать компилятор, надо возложить на него.
оптимизация кода - последний (и далеко не обязательный) шаг и выполняется только в том случае, когда показано, что оптимизация нужна и достоверно установлено узкое место.
практика показывает, что в подавляющем большинстве "бытовых" случаев аккуратный грамотный код является достаточно эффективным (см. присваивание и std::copy).
основное влияние на эффективность оказывают применяемые архитектурные решения, структуры данных и алгоритмы. оптимизация на уровне компилятора - выжимание последних копеек. смысла выжимать копейки, когда не выжаты рубли, нет. всё равно что оптимизировать Алгоритм Шлемиля smile

Добавлено через 18 секунд
о, а он уже ответил)))
PM MAIL   Вверх
savigm
Дата 19.2.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



Цитата(mes @  19.2.2010,  15:18 Найти цитируемый пост)
memcpy/memmov для копирования участков памяти (а не объектов)

Т.е. копирование массивов и все? В остальных случаях имеется присваивание. Насколько я понимаю все mem* функции кроме как для работы с массивами ненужны.
PM MAIL ICQ   Вверх
mes
Дата 19.2.2010, 15:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(savigm @  19.2.2010,  14:26 Найти цитируемый пост)
Т.е. копирование массивов и все? В остальных случаях имеется присваивание. Насколько я понимаю все mem* функции кроме как для работы с массивами ненужны. 

в C++ нет- они даже для работы с массивами не рекомендованы..  перечитайте еще раз что написано выше.

участок памяти и массив объектов - разные по сути вещи и имеют разные гарантии и требования.

P.S. кстати стоит задуматься что означает корень mem в названии функции - это и будет ответом на вопрос для чего предназначена функция  smile


Это сообщение отредактировал(а) mes - 19.2.2010, 15:44


--------------------
PM MAIL WWW   Вверх
savigm
Дата 19.2.2010, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



Так в каких задачах может понадобиться копировать просто кусок памяти(не объектов)? Я с такими задачами не сталкивался.
PM MAIL ICQ   Вверх
mes
Дата 19.2.2010, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(savigm @  19.2.2010,  18:08 Найти цитируемый пост)
Так в каких задачах может понадобиться копировать просто кусок памяти(не объектов)?

В С++ использовать ее пользователю прикладного софта нет смысла, так как есть более удобные и безопасные функции для  такого рода задач, а вот реализация этих этих самых функций, используют memmove после того как убедится, что "объект" можно представить как "кусок памяти" и для задачи нет способа лучше.

Сразу хочу отметить что убеждение, упомянутое выше, проходит на этапе компиляции и следовательно никаких накладных расходов не несет.
smile

Это сообщение отредактировал(а) mes - 19.2.2010, 20:39


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0864 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.