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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование последовательности байтов во float 
V
    Опции темы
UnrealMan
Дата 20.4.2009, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mrbrooks @  20.4.2009,  13:47 Найти цитируемый пост)
По мне так использование анонимного объединения ничем не хуже memcpy.

А данные в объединении с воздуха берутся? Копировать байты по-любому приходится - либо циклом, как предложено выше, либо тем же memcpy, либо ещё чем-то аналогичным. Так зачем копировать данные в какое-то там объединение, если можно скопировать их сразу в переменную типа float? smile 

Это сообщение отредактировал(а) UnrealMan - 20.4.2009, 14:12
PM MAIL   Вверх
mrbrooks
Дата 20.4.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(UnrealMan @  20.4.2009,  14:03 Найти цитируемый пост)
Копировать байты по-любому приходится - либо циклом, как предложено выше, либо тем же memcpy. Так зачем копировать данные в какое-то там объединение, если можно скопировать их сразу в переменную типа float?

с этим согласный   smile 
PM MAIL   Вверх
GoldFinch
Дата 20.4.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(UnrealMan @  20.4.2009,  15:03 Найти цитируемый пост)
Копировать байты по-любому приходится - либо циклом, как предложено выше, либо тем же memcpy,

инструкцией mov
в 32 разрядных системах 4байтовые переменные должны копироваться 1 инструкцией mov (или m2m)
использование циклов, функций библиотек языка или апи для копирования 4 байт это бред %)

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


Explorer
****


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

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



GoldFinch,  в С\С++ нет инструкции mov, там вообще нет никаких инструкций  smile 


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


Шустрый
*


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

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



 я тоже умею  smile, (оч. часто юзаю)
Код

float ConvertCharToFloat(char* a)
{
    float n;
    char* n1;
    float* n2=&n;
    n1=(char *) n2;
    for (int i=0;i<4;i++)
        n1[i]=a[i];
    return n;
}



Это сообщение отредактировал(а) Irdis - 20.4.2009, 18:24
PM MAIL   Вверх
zim22
Дата 20.4.2009, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Irdis @  20.4.2009,  18:18 Найти цитируемый пост)
я тоже умею  , (оч. часто юзаю)

тогда уж так. хотя как уже выяснилось в этой теме - вариант с memcpy - оптимальный.
Код

float ConvertCharToFloat(char* a)
{
    float result;
    for (int i = 0; i != 4; ++i)
        ((char*)&result)[i] = a[i];
    return result;
}



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



****


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

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



zim22, в каком месте он оптимальный? по скорости? по объему кода? про числу строчек исходника? да ниразу
PM MAIL ICQ   Вверх
zim22
Дата 20.4.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



GoldFinch, предлагайте тогда альтернативные варианты. не словом, а делом.


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


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


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

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



Цитата(zim22 @  20.4.2009,  18:10 Найти цитируемый пост)
GoldFinch, предлагайте тогда альтернативные варианты. не словом, а делом. 

 a он разве не предложил ?
Цитата(GoldFinch @  17.4.2009,  15:53 Найти цитируемый пост)
*(float*)data

 и даже обосновал, почему этот вариант ему кажется самым привлекательным:
Цитата(GoldFinch @  20.4.2009,  13:21 Найти цитируемый пост)
в 32 разрядных системах 4байтовые переменные должны копироваться 1 инструкцией mov (или m2m)

ну и не забыл охарактеризовать  другие подходы :

Цитата(GoldFinch @  20.4.2009,  13:21 Найти цитируемый пост)
использование циклов, функций библиотек языка или апи для копирования 4 байт это бред %)

Как видите и словом и делом smile



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


depict1
****


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

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



Цитата(GoldFinch @  20.4.2009,  18:54 Найти цитируемый пост)
в каком месте он оптимальный? по скорости? по объему кода? про числу строчек исходника? да ниразу

Цитата(GoldFinch @  20.4.2009,  14:21 Найти цитируемый пост)
в 32 разрядных системах 4байтовые переменные должны копироваться 1 инструкцией mov (или m2m)

Поставьте бряк на строке с memcpy и войдите внуть функции. Вас перекинет в файл memcpy.asm. Это же ваш любимый ассемблер! Ваши любимые команды! Мечты сбываются  smile 

Это сообщение отредактировал(а) zim22 - 20.4.2009, 20:13


--------------------
PM MAIL   Вверх
vinter
Дата 20.4.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(mes @  20.4.2009,  20:23 Найти цитируемый пост)
и даже обосновал, почему этот вариант ему кажется самым привлекательным:

Цитата(mes @  20.4.2009,  20:23 Найти цитируемый пост)
ну и не забыл охарактеризовать  другие подходы :

круто, а когда надо будет строку с цифрами выражение парсить будем lua предлагать?

Это сообщение отредактировал(а) vinter - 20.4.2009, 20:36


--------------------
Мой блог
PM MAIL WWW   Вверх
UnrealMan
Дата 20.4.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(zim22 @  20.4.2009,  20:03 Найти цитируемый пост)
Поставьте бряк на строке с memcpy и войдите внуть функции. 

Это не самый лучший способ увидеть результат оптимизации компилятора smile Не знаю, как гнусь, а более-менее новые VC++ и IC++ умеют вместо вызова memcpy делать те же mov:

Код
void binary_to_float(const char* data, float& result)
004043C0  mov         eax,dword ptr [data] 
004043C4  mov         ecx,dword ptr [result] 
{
    std::memcpy(&result, data, sizeof(result));
004043C8  mov         edx,dword ptr [eax] 
004043CA  mov         dword ptr [ecx],edx 
}

Так что товарищи рукоблуды, занимающиеся оптимизацией посредством ассемблерных вставок, могут идти в баню.
PM MAIL   Вверх
GoldFinch
Дата 20.4.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(UnrealMan @  20.4.2009,  22:53 Найти цитируемый пост)
004043C8  mov         edx,dword ptr [eax] 
004043CA  mov         dword ptr [ecx],edx 

для этого используют push\pop, твой оптимизатор гуан*

Добавлено через 6 минут и 13 секунд
алсо такой код должен инлайниться, а идея использования отдельный функции для копирования 4 байт в 4 байта ничем не лучше чем если бы memcpy была отдельной функцией
PM MAIL ICQ   Вверх
mes
Дата 20.4.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GoldFinch @  20.4.2009,  21:27 Найти цитируемый пост)
для этого используют push\pop, твой оптимизатор гуан*

Добавлено через 6 минут и 13 секунд
алсо такой код должен инлайниться, а идея использования отдельный функции для копирования 4 байт в 4 байта ничем не лучше чем если бы memcpy была отдельной функцией 

сорри, но не уловил смысла, нельзя ли иначе (попроще) изъясниться ?



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


Опытный
**


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

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



Цитата(mes @  20.4.2009,  22:46 Найти цитируемый пост)
сорри, но не уловил смысла, нельзя ли иначе (попроще) изъясниться ?

Смысл примерно следующий: операции со стеком push и pop выполняются типа быстрее, чем простые mov с дополнительным регистром, только вот тупые разработчики компиляторов в Intel и Microsoft об этом не знают. А ещё mov (в отличие от push и pop) занимает страшно много места (вынуждая несчастных пользователей покупать терабайтные винчестеры для хранения полученных таким варварским способом исполнительных файлов). Короче, продемонстрированная оптимизация - полный песец, и, поэтому, ясень пень, тут нужно скорей хвататься за ассемблер, чтобы на нём родить самый оптимальный по своему количеству, скорости и переносимости исходный код.

Добавлено @ 01:45
Что касается приведённого мной кода, то он специально подобран так, чтобы всем сразу было видно, во что компилятор может превратить memcpy. Это не было предложением использовать на практике именно такой код.

Это сообщение отредактировал(а) UnrealMan - 21.4.2009, 11:26
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0621 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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