Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
1

Как работает memcpy?

17.01.2010, 20:06. Показов 4947. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Небольшой вопрос по поводу 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) ) ;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2010, 20:06
Ответы с готовыми решениями:

Memcpy, buffer overflow. Может ли возникнуть ошибка в функции memcpy
Бывает ли на практике такое, что код #define size 1000; // some value int x, y; /* ... */...

Не работает memcpy
Нужно просто полностью скопировать первый массив, во второй, длина у них одинакова. Делаю так:...

Как избавиться от побайтового копирования? memcpy
Здравствуйте, недавно использовал код , который побайтово копирует в кольцевой буфер данные...

Не получается использовать std::copy как memcpy?
Получил задание переписать свою код: Поля x, y указывают координаты, куда должен быть помещен...

7
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
17.01.2010, 20:21 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; // двигаем. чтобы первый был в конце концов последним
}
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
17.01.2010, 20:26  [ТС] 3
1. Я что то не понял. А для чего для этого вообще функцию писать надо? просто нельзя присвоить?
Видимо массивы просто так не желают присваиваться
Цитата Сообщение от insideone Посмотреть сообщение
Красивее было было бы пройтись циклом: записал в temp переменную последний бит сместил на 1, записал 2 бит, сместил на 1 и т.д.
Когда я так пытался, у меня почему-то получался в ответе 0...
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
17.01.2010, 20:41 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;
}
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
17.01.2010, 20:52  [ТС] 5
CheshireCat, Спасибо большое.
Вообще я думал о том, что memcpy вызвать надо всего один раз и уже это навело на мысль о его превосходстве ))..
С реверсом понравилось)).. симпатично))..
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
17.01.2010, 21:10 6
Цитата Сообщение от fasked Посмотреть сообщение
С реверсом понравилось)).. симпатично))..
почитай тогда книгу "Алгоритмические трюки для программистов". там много всего с битами.
1
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
17.01.2010, 21:23 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, причем намного) Потом опомнился и переделал в релизе
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
17.01.2010, 21:41  [ТС] 8
Ну я вообще не особо доверял бы всяческим GetTickCount при тестировании.
0
17.01.2010, 21:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2010, 21:41
Помогаю со студенческими работами здесь

Memcpy работает медленно
В коде есть участок с копированием памяти через memcpy в цикле (из разных мест память кусками...

Memcpy криво работает
Всем доброго дня. Вот столкнулся с проблемой связанной с работой процедуры memcpy. Дело в том что...

Memcpy
Проблема такая, что если я ввожу хекс отрицательного числа, то d присваивается значение NaN. Почему...

memset, memcpy
Использую MSVS 2008. Почему memcpy работает только с char? То есть, такой код работает: int...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru