Максимальная оптимизация обычно требует использования определенных требований.Вы делаете код менее общим, чтобы набрать скорость (или какую-то другую метрику).Возможно, вы знаете какой-то угол, который вы можете вырезать, но мы должны догадаться.
Фрагменты кода ниже используют следующие заголовки:
#include <stdio.h>
#include <string.h>
Если вы хотите максимизировать производительность, это поможетвыделите достаточно места для последней строки, после вставки:
#define MAX_STR_LEN 256
char aa[MAX_STR_LEN] = "Hello, !";
char bb[] = "World";
Вы не указываете, откуда вы знаете, куда вставить.Для моего примера кода я определяю точку вставки как смещение в строке назначения:
size_t pos = 7;
Если вы заранее знаете одну из длин строки, вы должны использовать const вместо вызова strlen, который должен сканироватьстрока.Здесь я не думаю, что вам повезло.
size_t srclen = strlen(bb);
Функция memmove
правильно обрабатывает перекрывающиеся источники и назначения:
// +1 for count to include terminating null
memmove(aa+pos+srclen, aa+pos, strlen(aa)-pos+1);
memcpy
быстрее в некоторыхплатформы и могут быть безопасно использованы для копирования между строками:
memcpy(aa+pos, bb, srclen);
Теперь aa
содержит результат.
Если вы не можете предварительно выделить aa
до требуемого размера,затем:
// additional include for malloc
#include <stdlib.h>
char aa[] = "Hello, !";
char bb[] = "World";
size_t pos = 7;
size_t srclen = strlen(bb);
size_t dstlen = strlen(aa);
char *m = malloc(srclen+dstlen+1);
// Test for NULL or use an allocator that throws
memcpy(m, aa, pos);
memcpy(m+pos, bb, srclen);
memcpy(m+pos+srclen, aa+pos, dstlen-pos+1);
m
содержит результат и, вероятно, в конечном итоге должно быть free
'd.
Запомните, есть ли вероятность переполнения буфера, вы должны проверить длинучтобы избежать повреждения памяти и возможной уязвимости безопасности.
Надеюсь, это поможет.