LINUX.ORG.RU

memcpy в обратном порядке


0

1

Интересуют всевозможные варианты функции, аналогичной memcpy, но копирующей данные в обратном порядке (побайтово или по 16 бит etc).

Интересуют любые аппаратные платформы.

★★
Ответ на: комментарий от arsi

>«в обратном порядке» ≠ «в обратном направлении».

Тогда стремительно и быстро озвучте определение «в обратном порядке».

bukinist
()
Ответ на: комментарий от mashina

>цикл обыкновенный чем не устраивает?

Производительностью?

gnu-eabi
()
Ответ на: комментарий от bukinist

стремительно? быстро? детка, а не оборзел ли ты?

arsi ★★★★★
()
Ответ на: комментарий от mashina

Устроит всем, кроме производительности при больших количествах данных.

Интересно, есть ли какие-либо _существующие, возможно, платформо-зависимые_ функции для выполнения этого действия.

bk_ ★★
() автор топика
Ответ на: комментарий от bukinist

Очевидно, что это когда при копировании массива «123456» получаешь «654321».

Reset ★★★★★
()
Ответ на: комментарий от bk_

> Устроит всем, кроме производительности при больших количествах данных.

а я вот в этом только что засомневался :)

скомпилил тест с примитивной функцией на сях:

void invcpy(char *dst, const char *src, unsigned long len) {
    dst += len;
    while (len--)
        *--dst = *src++;
}

и тот же тест с аналогичной функцией на асме, пытаясь оптимизировать тело цикла... короче, проиграл я gcc -O3, его вариант почти в 3 раза быстрее... :(

arsi ★★★★★
()
Ответ на: комментарий от bukinist

> Теперь представь сынок что буферы перекрываются

садись, двойка.

ТС:

варианты функции, аналогичной memcpy

ISO/IEC 9899:1999:

The memcpy function copies n characters from the object pointed to by s2 into the object pointed to by s1. If copying takes place between objects that overlap, the behavior is undefined.

> или «о ужас» dst = src + len.

лолшто?

arsi ★★★★★
()
Ответ на: комментарий от arsi

Поищи у Касперски, у него есть примеры memcpy и memmove с оптимизациями.

devl547 ★★★★★
()
Ответ на: комментарий от arsi
void * qwerty(void *dest, void *src, size_t n)
{
	void *ret = dest;
	
	*(int8_t**)&dest += n;
	*(int8_t**)&src += n;
	while (n / 4 && (n -= 4,1))
		*--*(int32_t**)&dest = *--*(int32_t**)&src;
	while (n--)
		*--*(int8_t**)&dest = *--*(int8_t**)&src;
	
	return ret;
}
osox
()
void
memcpy_forward(void *dst, const void *src, size_t size)
{
        u_int8_t *p, *q;

        q = dst;
        p = (void *)src + size - 1;

        do {
                *q++ = *p;
        } while (p-- != src);
}
rg-400
()
Ответ на: комментарий от osox
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>

void * qwerty(void *dest, void *src, size_t n)
{
   void *ret = dest;
   
   *(int8_t**)&dest += n;
   *(int8_t**)&src += n;
   while (n / 4 && (n -= 4,1))
      *--*(int32_t**)&dest = *--*(int32_t**)&src;
   while (n--)
      *--*(int8_t**)&dest = *--*(int8_t**)&src;
   
   return ret;
}
#include <boost/timer.hpp>
int main()
{
	size_t size = 1048576 * 50; // 50 mb
	size_t intern = 400;
	char *dest = (char*)malloc(size);
	timer tt;
	for (;;)
	{
		tt.restart();
		for (size_t i = 0; i < intern; i++)
			qwerty(dest, dest, size);
		printf("my %f\n", tt.elapsed());
		tt.restart();
		for (size_t i = 0; i < intern; i++)
			memmove(dest, dest, size);
		printf("wr %f\n", tt.elapsed());
	}
}


my 14.156000
wr 13.765000
my 14.000000
wr 13.735000
my 13.953000
wr 13.719000
my 13.922000
wr 13.718000
my 13.922000
wr 13.719000
my 13.937000
wr 13.719000
my 13.938000
wr 13.719000
my 13.938000
wr 13.734000
my 13.984000
wr 13.735000
my 13.937000
wr 13.719000
my 13.937000

разница 2-3% но эта писалась на сишке пять минут а та на асме намного дольше

osox
()
Ответ на: комментарий от osox

разница в том, что твой код не дает правильный результат.

const char s[] = "hello, world";
char s1[sizeof(s)];

qwerty(s1, s,sizeof(s));

//в s1 hello, worldh,  а должно быть dlrow ,olleh

для ТС:

1) Написать простую рабочую версию.(будет с чем сравнивать и меньше времени потратишь на решение возможно несуществующей проблемы).

2) Если нужно оптимизировать, пусть это сделает компилятор.

3) Если не помогло, делаешь это сам.

К.О.

rg-400
()
Ответ на: комментарий от rg-400

да я аналог memmove написал ТС написал бы реверс куска памяти а не memcpy наоборот я сразу же подумал о memmove

osox
()
Ответ на: комментарий от bk_

А нет ли возможности вообще обойтись без переворачивания данных? Или вообще может можно решить задачу каким-то иным способом, где не нужно ни копирование, ни переворот.

pathfinder ★★★★
()
Ответ на: комментарий от bk_

Работа с raw-lpcm.

И что там переворачивать, endian чтоли менять?

mashina ★★★★★
()
Ответ на: комментарий от pathfinder

Это будет работать быстрее, чем через цикл?

может и не будет, но главное что ты «въехал».

true_admin ★★★★★
()
Ответ на: комментарий от pathfinder

Возможно, но это уже другой вопрос.

Всем, кто дал нормальный ответ, спасио

bk_ ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.