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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
#1

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

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

Небольшой вопрос по поводу 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2010, 20:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как работает memcpy? (C++):

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

Не работает memcpy - C++
Нужно просто полностью скопировать первый массив, во второй, длина у них одинакова. Делаю так: BYTE in; // = {10, ...} типа заполнен...

Как избавиться от побайтового копирования? memcpy - C++
Здравствуйте, недавно использовал код , который побайтово копирует в кольцевой буфер данные static quint16 const BUF_SIZE = 4096; ...

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

memset, memcpy - C++
Использую MSVS 2008. Почему memcpy работает только с char? То есть, такой код работает: int main() { char a1 = &quot;123&quot;; ...

2d ---> 1d array и memcpy - C++
Можно ли сконвертировать двумерный массив в одномерный с помощью memcpy? Если да, то будет ли быстрее, чем тупое перебирание в циклах?

7
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,473
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
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.01.2010, 20:26  [ТС] #3
1. Я что то не понял. А для чего для этого вообще функцию писать надо? просто нельзя присвоить?
Видимо массивы просто так не желают присваиваться
Цитата Сообщение от insideone Посмотреть сообщение
Красивее было было бы пройтись циклом: записал в temp переменную последний бит сместил на 1, записал 2 бит, сместил на 1 и т.д.
Когда я так пытался, у меня почему-то получался в ответе 0...
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,380
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
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.01.2010, 20:52  [ТС] #5
CheshireCat, Спасибо большое.
Вообще я думал о том, что memcpy вызвать надо всего один раз и уже это навело на мысль о его превосходстве ))..
С реверсом понравилось)).. симпатично))..
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.01.2010, 21:10 #6
Цитата Сообщение от fasked Посмотреть сообщение
С реверсом понравилось)).. симпатично))..
почитай тогда книгу "Алгоритмические трюки для программистов". там много всего с битами.
1
insideone
Модератор
Автор FAQ
3642 / 921 / 49
Регистрация: 10.01.2010
Сообщений: 2,473
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
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.01.2010, 21:41  [ТС] #8
Ну я вообще не особо доверял бы всяческим GetTickCount при тестировании.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2010, 21:41
Привет! Вот еще темы с ответами:

Strict aliasing и memcpy - C++
Что-то я никак не врублюсь, как согласуются между собой strict aliasing и функции жонглирующие void*? Возьмем для примера memcpy....

Своя реализация memcpy - C++
Собственно одно из заданий Дейтела это требует. Но только я столкнулся с тем что void *memcpy(void *s1, const void *s2, size_t n) ...

Объяснить работу Memcpy - C++
Доброго времени суток! Можете пояснить работу memcpy под C++? Что-то у меня определённо работает не так. Например такой код: ...

Работа функции memcpy - C++
Подскажите пожалуйста: 1. Каким образом работает функция memcpy(&amp;buf1,&amp;genday,2) и какого типа данные окажутся в buf1? Заранее всем...


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
17.01.2010, 21:41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru