![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
savigm |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 15.12.2008 Где: г. Зеленоград Репутация: нет Всего: нет |
Есть указатель pst на структуру ST и переменная st той-же структуры ST.
Вопрос: что лучше использовать memcpy(pst, &st, sizeof(ST)) или простое присваивание *pst = st? Просьба ответы аргументировать. |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 |
|||
|
||||
savigm |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 15.12.2008 Где: г. Зеленоград Репутация: нет Всего: нет |
Наверное если приимущество есть, его можно только замерить по времени что быстрее копирует и какие обьемы данных. По дизассемблеру вряд-ли что-то скажешь.
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
savigm,
по такому
дизассемблеру недостаточно понятно? |
|||
|
||||
savigm |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 15.12.2008 Где: г. Зеленоград Репутация: нет Всего: нет |
Действительно код идентичен. Что за компилятор?
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
MSVC 7.1
Добавлено через 54 секунды в GCC и Intel наверняка будет нечто похожее |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Преимущество выражено не только временем исполнения.. есть куча других факторов, которые могут иметь (и зачастую имеют) большее значение, особенно с учетом того, что на современных компиляторах высокоуровневые инструкции хорошо оптимизируются и разворачиваются в одинаковый по скорости код, если по сути одинаковы. ![]() Это сообщение отредактировал(а) mes - 19.2.2010, 02:16 |
|||
|
||||
savigm |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 15.12.2008 Где: г. Зеленоград Репутация: нет Всего: нет |
mes, это вы о каких факторах говорите, разве время копирования не решающий фактор?
Если разницы между memcpy и присваиванием нет, то зачем вообще memcpy существует? Может это пережиток прошлого, когда это был единственный способ копирования структур, т.е. когда присваивания небыло в стандарте Си? |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
1. разница все-таки есть. присваивание по стандарту осуществляется почленно. для каждого члена вызывается operator=(). семантика присваивания совпадает с семантикой memcpy только для POD типов 2. memcpy это функция стандартной библиотеки C. в С++ существует для совместимости. в С++ имеется std::copy для тех же целей (которая в уместных случаях может вызывать memcpy - так построены многие реализации) |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
те из которых складывается удобство и безопасность использования, а также (что значительно важней) поддержки конструкции. при том последнее для memcpy проблематично
кстати эта функция обладает еще одним "скрытым" недостатком, которого нет в memmove (ну думаю без пояснения понятно какой, если нет - читать manual по memmove) чтоб избавиться от этих недостатков А нужна для копирования массивов. memcpy/memmovе для копирования участков памяти (а не объектов) ![]() Это сообщение отредактировал(а) mes - 19.2.2010, 15:46 |
||||
|
|||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
mes молчит, отвечу за него, надеюсь не обидится ![]() разработка - многогранный процесс, и далеко не всегда производительность играет решающую роль. решающую роль обычно имеет совокупность скорости разработки, качества с точки зрения соответствия ТЗ и качества с точки зрения легкости последующей модернизации и сопровождения. для достижения этого код в первую очередь должен быть прост и ясен; все что может проверить или автоматически реализовать компилятор, надо возложить на него. оптимизация кода - последний (и далеко не обязательный) шаг и выполняется только в том случае, когда показано, что оптимизация нужна и достоверно установлено узкое место. практика показывает, что в подавляющем большинстве "бытовых" случаев аккуратный грамотный код является достаточно эффективным (см. присваивание и std::copy). основное влияние на эффективность оказывают применяемые архитектурные решения, структуры данных и алгоритмы. оптимизация на уровне компилятора - выжимание последних копеек. смысла выжимать копейки, когда не выжаты рубли, нет. всё равно что оптимизировать Алгоритм Шлемиля ![]() Добавлено через 18 секунд о, а он уже ответил))) |
|||
|
||||
savigm |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 15.12.2008 Где: г. Зеленоград Репутация: нет Всего: нет |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
в C++ нет- они даже для работы с массивами не рекомендованы.. перечитайте еще раз что написано выше. участок памяти и массив объектов - разные по сути вещи и имеют разные гарантии и требования. P.S. кстати стоит задуматься что означает корень mem в названии функции - это и будет ответом на вопрос для чего предназначена функция ![]() Это сообщение отредактировал(а) mes - 19.2.2010, 15:44 |
|||
|
||||
savigm |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 15.12.2008 Где: г. Зеленоград Репутация: нет Всего: нет |
Так в каких задачах может понадобиться копировать просто кусок памяти(не объектов)? Я с такими задачами не сталкивался.
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
В С++ использовать ее пользователю прикладного софта нет смысла, так как есть более удобные и безопасные функции для такого рода задач, а вот реализация этих этих самых функций, используют memmove после того как убедится, что "объект" можно представить как "кусок памяти" и для задачи нет способа лучше. Сразу хочу отметить что убеждение, упомянутое выше, проходит на этапе компиляции и следовательно никаких накладных расходов не несет. ![]() Это сообщение отредактировал(а) mes - 19.2.2010, 20:39 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |