Форум программистов, компьютерный форум CyberForum.ru

Как работает memcpy? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.01.2010, 20:06     Как работает memcpy? #1
Небольшой вопрос по поводу memcpy.
Какая из функций будет работать быстрее?

C++
1
typedef unsigned int WORD32;
1 вариант
C++
1
2
3
4
5
6
7
void wcpy(WORD32 * D, WORD32 * S, int size)
{
    while(size--)
    {
        *D++ = *S++;
    }
}


2 вариант
C++
1
2
3
4
5
6
7
void _wcpy(WORD32 * D, WORD32 * S, int size)
{
    if(D != S)
    {
        memcpy(D, S, size*sizeof(WORD32));
    }
}


Я сам конечно понимаю, что скорее всего второй вариант адекватнее, но хотелось бы узнать подробности

И второй вопрос, как сделать реверс числа, тобишь из числа типа 0xABCD надо получить 0xDCBA...
Я тут набросал небольшой кусок, но он совсем отвратный..))) Хочется более красивое решение ))..

реверс
C++
1
2
3
4
5
6
7
8
9
10
WORD32 wrev(WORD32 X)
{
    return ( (X<<28) | (((X >>  4) << 28) >>  4)  | \
               (((X >>  8) << 28) >>  8)  | \
               (((X >> 12) << 28) >> 12) | \
               (((X >> 16) << 28) >> 16) | \
               (((X >> 20) << 28) >> 20) | \
               (((X >> 24) << 28) >> 24) | \
                     ((X) >> 28) ) ;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2010, 20:06     Как работает memcpy?
Посмотрите здесь:

C++ Насчёт функции memcpy()
memset, memcpy C++
Memcpy, buffer overflow. Может ли возникнуть ошибка в функции memcpy C++
Не получается использовать std::copy как memcpy? C++
C++ Memcpy - вылетает исключение
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
17.01.2010, 20:21     Как работает memcpy? #2
1. Я что то не понял. А для чего для этого вообще функцию писать надо? просто нельзя присвоить? Зачем передавать size если он известен (4 бита).
2. Красивее было было бы пройтись циклом: записал в temp переменную последний бит сместил на 1, записал 2 бит, сместил на 1 и т.д.
C++
1
2
3
4
5
for (int i = 0; i < 32; i++)
{
    temp = inverted & (1 << i); // отрывает соот-ий бит
    temp = temp << 1; // двигаем. чтобы первый был в конце концов последним
}
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.01.2010, 20:26  [ТС]     Как работает memcpy? #3
1. Я что то не понял. А для чего для этого вообще функцию писать надо? просто нельзя присвоить?
Видимо массивы просто так не желают присваиваться
Цитата Сообщение от insideone Посмотреть сообщение
Красивее было было бы пройтись циклом: записал в temp переменную последний бит сместил на 1, записал 2 бит, сместил на 1 и т.д.
Когда я так пытался, у меня почему-то получался в ответе 0...
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
17.01.2010, 20:41     Как работает memcpy? #4
1. Вариант с memcpy, безусловно, лучше. Системные функции типа memcpy разрабатывают достаточно квалифицированные инженеры, вполне себе отдающие отчет в том, насколько часто такие функции будут вызываться; и поэтому код таких функций оптимизируется очень хорошо. Более того, некоторые компиляторы (например, MSVC++) вообще инлайнят эти функции, поэтому даже затрат на вызов в реальном коде нет.
Цикл, кстати, компилятор тоже может заинлайнить; но тут все же неопределенность больше.
2.
C++
1
2
3
4
5
6
7
int32_t reverse(int32_t X)
{
    X = (X >> 16) | (X << 16);
    X = ((X >> 8) & 0x00FF00FF) | ((X & 0x00FF00FF) << 8);
    X = ((X >> 4) & 0x0F0F0F0F) | ((X & 0x0F0F0F0F) << 4);
    return X;
}
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.01.2010, 20:52  [ТС]     Как работает memcpy? #5
CheshireCat, Спасибо большое.
Вообще я думал о том, что memcpy вызвать надо всего один раз и уже это навело на мысль о его превосходстве ))..
С реверсом понравилось)).. симпатично))..
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.01.2010, 21:10     Как работает memcpy? #6
Цитата Сообщение от fasked Посмотреть сообщение
С реверсом понравилось)).. симпатично))..
почитай тогда книгу "Алгоритмические трюки для программистов". там много всего с битами.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3623 / 901 / 48
Регистрация: 10.01.2010
Сообщений: 2,429
17.01.2010, 21:23     Как работает memcpy? #7
Цитата Сообщение от fasked Посмотреть сообщение
Видимо массивы просто так не желают присваиваться
Заучился

Так... по первому - ассемблированного кода на первый вариант чуть поменьше. Однако:
C++
1
2
3
4
5
6
    WORD32 A[10] = {12312,231231,2321321,213,123,12,312,31,23,3 }; WORD32 B[10];
    unsigned long int x = GetTickCount();
    for (unsigned long long int i = 0; i < 9999999999; ++i)
    wcpy(A, B, 10); // R 15109, 15078, 15125
    //_wcpy(A, B, 10); // R 15219, 15063, 15109
    x = GetTickCount() - x;
В комментах - результат x. Сначало сделал в дебаге, в дебаге вел _wcpy, причем намного) Потом опомнился и переделал в релизе
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2010, 21:41     Как работает memcpy?
Еще ссылки по теме:

2d ---> 1d array и memcpy C++
Объяснить работу Memcpy C++
Как избавиться от побайтового копирования? memcpy C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.01.2010, 21:41  [ТС]     Как работает memcpy? #8
Ну я вообще не особо доверял бы всяческим GetTickCount при тестировании.
Yandex
Объявления
17.01.2010, 21:41     Как работает memcpy?
Ответ Создать тему
Опции темы

Текущее время: 18:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru