В Perl я просто использую команду соединения:
$ echo "Alpha
Beta
Gamma" | perl -e 'print(join(", ", map {chomp; $_} <> ))'
Alpha, Beta, Gamma
(Материал карты должен главным образом там создать список.)
На языках, которые не имеют встроенного, как C, я использую простое (непротестированное) повторение:
for (i = 0; i < N-1; i++){
strcat(s, a[i]);
strcat(s, ", ");
}
strcat(s, a[N]);
Конечно, необходимо было бы проверить размер s перед добавлением большего количества байтов к нему.
У Вас или есть к особому случаю первая запись или последнее.
Маловероятно. Ваш компилятор / стандартная библиотека, вероятно, будет иметь очень эффективную и адаптированную реализацию memcpy. И memcpy - это, по сути, самый низкий api для копирования одной части памяти в другую.
Если вам нужно дополнительное ускорение, найдите способ избавиться от копирования памяти.
Во-первых, небольшой совет. Предположим, что люди, написавшие вашу стандартную библиотеку, не глупы. Если бы существовал более быстрый способ реализовать общий memcpy, они бы это сделали.
Во-вторых, да, есть альтернативы получше.
std :: copy
. Он делает то же самое, но в некоторых случаях он 1) безопаснее и 2) потенциально быстрее. Это шаблон, а это означает, что он может быть специализирован для определенных типов, что делает его потенциально более быстрым, чем обычный memcpy C. Эксперт по оптимизации Агнер Фог опубликовал оптимизированные функции памяти: http://agner.org/optimize/#asmlib . Однако это под GPL.
Некоторое время назад Агнер сказал, что эти функции должны заменить встроенные функции GCC, потому что они намного быстрее. Не знаю, делалось ли это с тех пор.
В зависимости от того, что вы пытаетесь сделать ... если это достаточно большой memcpy, и вы пишете только в копию редко, mmap с MMAP_PRIVATE для создания копии -write сопоставление может быть быстрее.
Этот ответ на очень похожий вопрос (о memset ()
) применим и здесь.
По сути, это говорит о том, что компиляторы генерируют очень оптимальный код для memcpy ()
/ memset ()
- и другой код в зависимости от природы объектов (размер, выравнивание и т. Д.) .
И помните, только memcpy ()
POD в C ++.
Я не уверен, что использование memcpy по умолчанию всегда лучший вариант. Большинство реализаций memcpy, которые я рассмотрел, имеют тенденцию пытаться выровнять данные в начале, а затем делать выровненные копии. Если данные уже выровнены или слишком малы, то это напрасная трата времени.
Иногда полезно иметь специализированное копирование слова, половинное слово, байтовое копирование memcpy, если это не оказывает слишком негативного воздействия в кэшах.
Кроме того, вам может потребоваться более точный контроль над фактическим алгоритмом распределения. В игровой индустрии очень часто люди пишут свои собственные процедуры распределения памяти, независимо от того, сколько усилий было потрачено разработчиками инструментальной цепочки в первую очередь на ее разработку. В играх, которые я видел, почти всегда используется Malloc Дуга Ли .
В зависимости от вашей платформы могут быть определенные варианты использования, например, если вы знаете, что источник и место назначения выровнены по строке кэша, а размер является целым числом, кратным размеру строки кеша. Однако в целом большинство компиляторов будут производить довольно оптимальный код для memcpy.