LINUX.ORG.RU

История изменений

Исправление linuhs_user, (текущая версия) :

грят sprintf() медленнее чем memcpy()

Зато код короче, ты же не прошивку ракеты пишешь.

$ gcc main.c
$ time ./a.out memcpy
REPEAT: 65536

real	0m1,493s
user	0m0,046s
sys	0m0,251s

$ time ./a.out sprintf
REPEAT: 65536

real	0m1,508s
user	0m0,068s
sys	0m0,251s
В тесте сконекчивание 4 строк, 4 раза. «%s%s%s». Выполняется оно 65536 раз в цикле, посмотри на разницу, ее почти нет.

если через массив делать, то никогда не знаешь какой длины будет путь

Так на него ограничение есть, ты все равно большой путь заюзать не сможешь, смысл в большом массиве?

#include <linux/limits.h>

char current_path[PATH_MAX];

а так ты всегда выделяешь под необходимое количество символов размер.

char* str = ...;

char* buff;
int   buff_size;

buff_size = snprintf(NULL, 0, "%s%s", str, "hello");
buff = malloc(buff_size + 1);
sprintf(buff, "%s%s", str, "hello");

Исходная версия linuhs_user, :

грят sprintf() медленнее чем memcpy()

Зато код короче, ты же не прошивку ракеты пишешь.

$ gcc main.c
$ time ./a.out memcpy
REPEAT: 65536

real	0m1,493s
user	0m0,046s
sys	0m0,251s

$ time ./a.out sprintf
REPEAT: 65536

real	0m1,508s
user	0m0,068s
sys	0m0,251s
В тесте сконекчивание 4 строк, 4 раза. «%s%s%s». Выполняется оно 65536 раз в цикле, посмотри на разницу, ее почти нет.

если через массив делать, то никогда не знаешь какой длины будет путь

Так на него ограничение есть:

#include <linux/limits.h>

char current_path[PATH_MAX];

а так ты всегда выделяешь под необходимое количество символов размер.

char* str = ...;

char* buff;
int   buff_size;

buff_size = snprintf(NULL, 0, "%s%s", str, "hello");
buff = malloc(buff_size + 1);
sprintf(buff, "%s%s", str, "hello");