![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
есть код который копирует чтоугодно используя
есть ли смысл писать отдельный код для арифметических типов?
в MSVC memcpy при оптимизации может преобразовываться в "mov x,y" однако мне неизвестно всегда ли так происходит, и тем более я не знаю как дела у других компиляторов |
||||
|
|||||
| hsilgos |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 26.4.2009 Репутация: 1 Всего: 2 |
Не "что угодно", а только POD - типы. Т.е. простые типы и структуры из них. (ну еще структуры из таких структур). На каком-то мало-мальски сложном классе, где перегружены конструкторы копирования и операторы = этот код обломится. Добавлено через 1 минуту и 18 секунд
Точно так же он и
соптимизирует |
||||||
|
|||||||
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
hsilgos, я в курсе про POD типы, и я не про них спрашиваю
"*(T*)buf = t;" это и есть "mov x,y", его какбэ не надо оптимизировать вопрос про то, можно ли доверять memcpy(buf,t,n); при копировании арифметических типов Добавлено через 14 минут и 35 секунд вобщем чтобы небыло флуда, вопрос такой, какой код выбрать:
или такой
|
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
насколько я знаю, так как memcpy не знает типов объектов, оптимизации будет подаваться уже конечный результат, т.е результат напрямую зависит от качества оптимизатора. может посмотреть в сторону uninitialized_copy и ее напарников ? |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
mes, я посмотрел на uninitialized_copy и не понял зачем оно тут
мне надо сохранять данные в буфер чтобы потом этот буфер отправить по сети если данные это массив\вектор арифметических типов, или строка, или структура из арифметических типов, очевидно проще всего скопировать его(ее) используя memcpy если данные - арифметический тип - его тоже можно скопировать используя memcpy, а можно написать для него отдельный "оптимальный" код копирующий присваиванием, но я не знаю будет ли это отличаться от memcpy в бинарнике при копировании арифметического типа используя memcpy его размер будет известен на этапе компиляции, и у компилятора есть возможность использовать оптимальную версию memcpy, например 1 mov для int, float и 2 mov для __int64, double но я не уверен будут ли компиляторы это всегда делать |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ниже сказанное нуждается в проверке, но насколько я знаю, memcpy реализовано примерно следующим способом :
т.е заточено не под типы, а под размер и для типов "малых" размеров после раскрытия циклов остается лишь простое присваивание. работать должно для каждого компилятора умеющего раскрывать простые циклы. Это сообщение отредактировал(а) mes - 5.7.2009, 17:10 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
т.е. можно оставить только memcpy.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |