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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> копирование арифметических типов 
V
    Опции темы
GoldFinch
Дата 4.7.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



есть код который копирует чтоугодно используя
Код

 ... (void* t, size_t n) {
    memcpy(buf,t,n);
    ...

есть ли смысл писать отдельный код для арифметических типов?
Код

template<typename T> ... (T t) {
    *(T*)buf = t;
    ...

в MSVC memcpy при оптимизации может преобразовываться в "mov x,y"
однако мне неизвестно всегда ли так происходит, и тем более я не знаю как дела у других компиляторов
PM MAIL ICQ   Вверх
hsilgos
Дата 5.7.2009, 00:39 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

есть код который копирует чтоугодно используя

Не "что угодно", а только POD - типы. Т.е. простые типы и структуры из них. (ну еще структуры из таких структур).
На каком-то мало-мальски сложном классе, где перегружены конструкторы копирования и операторы = этот код обломится.

Добавлено через 1 минуту и 18 секунд
Цитата

в MSVC memcpy при оптимизации может преобразовываться в "mov x,y"

Точно так же он и 
Код

*(T*)buf = t;

соптимизирует
PM MAIL   Вверх
GoldFinch
Дата 5.7.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



hsilgos, я в курсе про POD типы, и я не про них спрашиваю
"*(T*)buf = t;" это и есть "mov x,y", его какбэ не надо оптимизировать

вопрос про то, можно ли доверять memcpy(buf,t,n); при копировании арифметических типов

Добавлено через 14 минут и 35 секунд
вобщем чтобы небыло флуда, вопрос такой, 
какой код выбрать:
Код

struct pod_type
{
    template<typename T>
    static void copy(T& t)
    {
        memcpy(buf,&t,sizeof(T));
    }
}

template<typename T>
void copy(T& t)
{
    boost::mpl::if_< boost::is_pod,
        pod_type,
    //else
        ...
    >::type::copy(t);
}

или такой
Код

struct pod_type
{
    template<typename T>
    static void copy(T& t)
    {
        memcpy(buf,&t,sizeof(T));
    }
}

struct arithmetic_type
{
    template<typename T>
    static void copy(T& t)
    {
        *(T*)buf = t;
    }
}

template<typename T>
void copy(T& t)
{
    boost::mpl::if_< boost::is_arithmetic<T>,
        arithmetic_type,
    //else
    boost::mpl::if_< boost::is_pod<T>,
        pod_type,
    //else
        ...
    >::type
    >::type::copy(t);
}



PM MAIL ICQ   Вверх
mes
Дата 5.7.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GoldFinch @  5.7.2009,  09:47 Найти цитируемый пост)
вопрос про то, можно ли доверять memcpy(buf,t,n); 

насколько я знаю, так как memcpy не знает типов объектов, оптимизации будет подаваться уже конечный результат, т.е результат напрямую зависит от качества оптимизатора.

может посмотреть в сторону uninitialized_copy и ее напарников ?



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



****


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

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



mes, я посмотрел на uninitialized_copy и не понял зачем оно тут
мне надо сохранять данные в буфер чтобы потом этот буфер отправить по сети
если данные это массив\вектор арифметических типов, или строка, или структура из арифметических типов, очевидно проще всего скопировать его(ее) используя memcpy
если данные - арифметический тип - его тоже можно скопировать используя memcpy, а можно написать для него отдельный "оптимальный" код копирующий присваиванием, но я не знаю будет ли это отличаться от memcpy в бинарнике
при копировании арифметического типа используя memcpy его размер будет известен на этапе компиляции, и у компилятора есть возможность использовать оптимальную версию memcpy, например 1 mov для int, float и 2 mov для __int64, double
но я не уверен будут ли компиляторы это всегда делать
PM MAIL ICQ   Вверх
mes
Дата 5.7.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GoldFinch @  5.7.2009,  15:01 Найти цитируемый пост)
при копировании арифметического типа используя memcpy его размер будет известен на этапе компиляции, и у компилятора есть возможность использовать оптимальную версию memcpy, например 1 mov для int, float и 2 mov для __int64, double

ниже сказанное нуждается в проверке, но насколько я знаю, memcpy реализовано примерно следующим способом :
Код

...
for ( ; size >= sizeof __int32; size -= sizeof __int32 )  *(__int32*)  dst++ =  *(__int32*) src++; 
for ( ; size >= sizeof __int16; size -= sizeof __int16 )  *(__int16*)  dst++ =  *(__int16*) src++; 
for ( ; size >= sizeof __int8;  size -= sizeof __int8  )  *(__int8*)   dst++ =  *(__int8*)  src++; 
..

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




Это сообщение отредактировал(а) mes - 5.7.2009, 17:10


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



****


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

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



т.е. можно оставить только memcpy.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0786 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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