скопировать блок памяти - PullRequest
11 голосов
/ 03 июня 2009

Мне нужно предложение о том, как эффективно скопировать блок памяти, по возможности, за одну попытку, на C ++ или ассемблере.

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

Ответы [ 6 ]

39 голосов
/ 03 июня 2009

Как насчет std::memcpy?

4 голосов
/ 03 июня 2009

Если вам нужно реализовать такую ​​функциональность самостоятельно, я предлагаю вам проверить Устройство Даффа , должно ли это быть сделано эффективно.

2 голосов
/ 03 июня 2009

Читая ваши комментарии, похоже, вы захотите использовать параллелизм. Для этого есть инструкции, но они работают только с регистрами, а не с памятью.

Это связано с архитектурой компьютера (я полагаю, x86).

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

Если вы можете поместить нужные данные в регистры, то вы можете использовать множество классных инструкций процессора, таких как MMX или SSE, для выполнения параллельных вычислений. Но что касается параллельного копирования памяти, это невозможно.

Как уже говорили другие, используйте memcpy. Это надежно, отлажено и быстро.

1 голос
/ 28 сентября 2009

Используйте memmove (), если источник и источник перекрываются. Обычно memcpy () и memmove () уже были оптимизированы для работы вашего компилятора. Если вы пишете замену, по крайней мере сравните ее с версиями clib, чтобы убедиться, что вы не замедляете код.

У меня есть блок, состоящий из 5000 строк или более, и функция, которая вызывается постоянно 10000 раз

Также рассмотрите возможность изменения структуры данных. Возможно, вместо двумерного массива у вас может быть одномерный массив указателей на вторичные массивы (столбцы). Тогда вместо того, чтобы копировать целые строки, вам нужно только скопировать или переместить указатели. Вы можете объединить массивы столбцов в свободный список, чтобы не тратить много времени на их выделение и освобождение.

0 голосов
/ 03 июня 2009

РЭП МОВСД в сборке что ли? Трудно сказать без дополнительной информации о том, что именно вы пытаетесь скопировать ... Или вы можете перепрограммировать контроллер DMA, чтобы сделать это тоже, но на самом деле это будет медленнее, чем просто использование процессора. : -)

0 голосов
/ 03 июня 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...