2013-09-02 3 views
7

У меня есть массив, который содержит историю значений, и при добавлении нового значения мне нужно сдвинуть все предыдущие значения на одну позицию влево, чтобы потерять самое старое значение и освободить место для следующего.Лучший способ сдвинуть массив в C?

я могу думать о двух способов сделать это, используя memmove:

memmove(&arr[0], &arr[1], sizeof(arr) - sizeof(*arr)); 

Или путем замены указателей:

for (i = 0; i != sizeof(arr) - 1; i++) { 
    *(arr + i) = *(arr + i + 1); 
} 

Есть ли разница в производительности между этими двумя методами, и если нет, о чем можно было бы посоветовать?

+1

Вы считали, что не используете массив для этого или это не опция? – nic

+1

@nic Мне нужно отслеживать последние значения X, поэтому я не могу думать о более логичном способе их хранения, кроме массива. – Muis

+0

Используйте очередь (вы все равно можете использовать массив для ее реализации) и избегайте копирования памяти. http://www.thelearningpoint.net/computer-science/data-structures-queues--with-c-program-source-code –

ответ

3

Оба они имеют одинаковую сложность по времени. Любая другая разница в производительности будет связана с конкретными обстоятельствами, такими как процессор, компилятор, как реализована memmove, и размер массива, поэтому вам нужно каждый раз измерять производительность и видеть, что лучше.

+1

Чтение сборки может также быть поучительным. – chrylis

1

Я не думаю, что массив - лучший способ сделать это, попробуйте использовать связанный список, и у вас не будет этой проблемы.

7

Существует более быстрый вариант:

circular buffer где вставки, удаления и читать все O (1).

0

Вы можете использовать FIFO Queue, реализованный как связанный список или как массив. Из вашего описания это самое простое решение.

Смежные вопросы