Ваш метод распределения эффективен, он измеряет общую длину и выделяется только один раз.Но цикл конкатенации многократно измеряет длину выходного буфера от начала до конкатенации к нему, что приводит к квадратичному времени выполнения.
Чтобы исправить это, следите за своей позицией на ходу:
size_t pos = 0;
for(int i = 1; i < argc; i++) {
size_t len = strlen(argv[i]);
memcpy(toAppend+pos, argv[i], len);
pos += len;
toAppend[pos] = ' ';
pos++;
}
toAppend[pos] = 0;
Это наиболее эффективный способ объединения в памяти, но наиболее эффективным является , а не объединение .Вместо этого:
for(int i = 1; i < argc; i++)
printf("%s ", argv[i]);
Вся причина, по которой stdio буферизуется, заключается в том, что вам не нужно создавать буферы произвольной длины в памяти для эффективного вывода;вместо этого он автоматически буферизует до фиксированного размера и сбрасывается при заполнении буфера.
Обратите внимание, что использование printf
неверно и опасно, если ваш ввод содержит символ %
в любом месте;это должно быть printf("%s", toAppend);
.
Если вы пишете в системы POSIX (или POSIX-ish), а не просто в C, другой вариант будет fmemopen
, что позволит вам написать цикл простокак:
for(int i = 1; i < argc; i++)
fprintf(my_memfile, "%s ", argv[i]);