Можно ли использовать memcpy для копирования части массива?
Нет, в общем случае это невозможно. Вы можете сделать это только в том случае, если тип элементов в массиве имеет тривиальный макет.
Скажем, например, у нас есть массив из 10 целых чисел. Можем ли мы создать новый массив и скопировать в него последние 5 целых чисел?
int
являются тривиальными типами, поэтому для этого конкретного случая это сработает:
int source[10] = { ::: };
int target[5];
std::memcpy( target, source + 5, 5 * sizeof(int) );
Существуют ли другие инструменты копирования/манипулирования памятью/массивом, доступные для использования с c/c++?
Конечно, весь набор алгоритмов в Стандартной библиотеке C++ будет работать с массивами. Вы используете указатели на первый и последний элементы в массиве как begin/end
итераторы. Или, если вы используете C++11, просто std::begin|end( array )
.
std::copy( source + 5, source + 10, target + 0 );
or
std::copy( std::begin(source) + 5, std::end(source), std::begin(target) );
Вот метафункция, которую вы можете использовать, чтобы проверить, является ли тип тривиальным, вместе с определением такой концепции: http://en.cppreference.com/w/cpp/types/is_тривиальный
person
K-ballo
schedule
07.02.2013
std::vector
, а не массивы при написании кода на C++ (если у вас нет действительно веской причины хотеть контейнер с фиксированным размером во время компиляции, и в этом случае вы должны использоватьstd::array
, а не встроенные массивы) . - person Mankarse   schedule 07.02.2013std::vector
будет максимально быстрым, если вы правильно его используете. - person K-ballo   schedule 07.02.2013