Размещение new также очень полезно при сериализации (скажем, с boost :: serialization). В 10 лет c ++ это только второй случай, когда мне нужно новое место для размещения (третий, если вы включаете интервью :)).
strcpy(s1 + strlen(s1),s2)
действительно ограничивают количество повторного сканирования s1
с повторными вычислениями до дополнительной длины данного s2
в следующем раунде.
Но, IMO, вместо этого трюка лучше просто написать функцию, которая не требует какого-либо повторного сканирования:
char *
xstrcat(char *s1,const char *s2)
{
for (; *s1 != 0; ++s1);
for (; *s2 != 0; ++s1, ++s2)
*s1 = *s2;
*s1 = 0;
return s1;
}
void
func(char *s1,const char *s2,const char *s3,const char *s4)
{
s1 = xstrcat(s1,s2);
s1 = xstrcat(s1,s3);
s1 = xstrcat(s1,s4);
}
Да: s1 += strlen(s1)
даст вам указатель на завершающий 0, поэтому strcpy(..., s2)
будет работать как strcat()
- добавление s2
к s1
(при условии, что в [115 достаточно места) ]. Обратите внимание, что strcpy()
не «делает цикл через s1, чтобы найти ноль» - он просто записывает в указанном месте strcat
, хотя и находит ноль.
Ключом к оптимизации является [ 118] мы на самом деле меняем s1
(лучше взять копию исходного значения), поэтому мы берем только длину последней добавленной строки, а не длину от начала первой строки (что и является [ 1110] решение подойдет).