Копировать блок памяти

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

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

Ответ 1

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

Ответ 6

REP MOVSD в сборке возможно? Трудно сказать без дополнительной информации о том, что вы пытаетесь скопировать... Или вы можете перепрограммировать контроллер DMA, чтобы сделать это тоже, но на самом деле это будет медленнее, чем просто использование процессора.: -)