Re[5]: Об эффективности программ
От: Sinclair Россия https://github.com/evilguest/
Дата: 07.10.05 14:10
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD> char szTotal[1000];

PD> char * szStrings[3] ={"abc", "def", "ghi"};
PD> int nStrings = 3;
PD> char* pCurrent = szTotal;
PD> for(int i = 0; i < nStrings; i++)
PD> pCurrent += sprintf(pCurrent,"%s",szStrings[i]);

Гм. Мне не хотелось бы прослыть человеком, приносящим дурные вести, но ты только что продемонстрировал способ внести в программу buffer overrun vulnerability.
Если не дай байт кто-то изменит содержимое szStrings так, что оно перестанет помещаться в szTotal (который ты предусмотрительно разместил на стеке), то спринтф чудесным образом разрушит стек.

Это, на мой взгляд, не вполне адекватная плата за однопроходность.
Еще я бы хотел отметить, что в твоем примере все живет за счет сверхмалых размеров строк. На таких объемах можно хоть перевыделениями заниматься — существенного падения производительности ты не добъешся. А как только мы заговорим о более реалистичном мире, где действительно станет нужна оптимизация строковых операций, выделение фиксированного буфера в стеке моментально исчезнет из поля нашего зрения.

Поэтому настоящие программисты всегда используют нормальный оо-код из std:: вместо всяких спринтфов и прочей небезопасной ерунды.

З.Ы. Кстати, поиск целого в массиве тоже лучше честно делать через
for(int i=0; i< arrayLen; i++) if array[i] == searched return i;

а попытки задействовать хардкор типа rep scasd ни к чему хорошему не приводят.
... << RSDN@Home 1.1.4 stable rev. 510>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.