- 1
- 2
- 3
- 4
n = strlen(pName);
name = new char[n + 1];
memset(name, 0, n + 1);
memcpy(name, pName, n);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+8
n = strlen(pName);
name = new char[n + 1];
memset(name, 0, n + 1);
memcpy(name, pName, n);
боянчик. std::string наверное религия не позволяет. а strdup() слишком С. oh wait...
bormand 09.10.2013 13:23 # +7
Слишком POSIX. В стандартах c/c++ такой функции нет...
А вот нахрена там memset я так и не понял... Ради зануления одного байтика в конце? :)
defecate-plusplus 09.10.2013 13:42 # +21
это прогрев выделенного буфера, чтобы новые данные в него затем быстро писались
Stertor 09.10.2013 15:03 # −7
govnomonad 09.10.2013 15:24 # +2
это же неправильный способ. Все же знают, что надо прогревать белым шумом.
TarasB 10.10.2013 09:40 # +4
roman-kashitsyn 10.10.2013 09:42 # +4
Stertor 10.10.2013 12:01 # 0
Ты фашист.
Вот еще полутоновый, с французским звучанием
http://higgs.rghost.ru/46926704/image.png
код в одном потоке с формой.
spivti 09.10.2013 16:33 # −1
походу знатный баян, ему место в С разделе.
roman-kashitsyn 09.10.2013 16:37 # +4
в теории memcpy должен быть ощутимо шустрее strcpy. А один проход по строке так или иначе делать придётся, чтобы посчитать длину буфера.
spivti 09.10.2013 16:41 # −3
тагда зачем она туда впихнута, если для определенных целей есть своя функция ее и нада юзать, непойму.
bormand 09.10.2013 19:27 # +3
memcpy в данном случае вполне адекватная замена strcpy/strncpy: мы знаем размер блока данных, который нам надо скопировать.
spivti 09.10.2013 19:31 # 0
ну это вопрос скорее к разрабам либы.)
Dummy00001 09.10.2013 19:33 # +3
spivti 09.10.2013 19:40 # −2
тормозишь? в отличии от memcpy(), strcpy()/strncpy() останавливаются на нулевом символе.
Где сдесь это используется, в этом примере, конкретно?
Ща миня ,заминусуют...
Dummy00001 09.10.2013 19:50 # +1
ты наехал на libc. ее никто сильно не любит, но она есть и работает.
> Ща миня ,заминусуют...
А то як жэ!
bormand 09.10.2013 20:17 # 0
Как ни парадоксально, но strcpy/strncpy/strcat/strncat юзабельны только для буферов, размер которых задан на этапе компиляции. В противном случае длину один хрен приходится хранить или замерять, и тогда memcpy работает быстрее, да и юзать его проще.
anonimb84a2f6fd141 09.10.2013 21:21 # 0
bormand 09.10.2013 21:23 # 0
В ненужности оного действа если мы и так знаем где он стоит. А мы знаем, т.к. длину строки или хранили или замерили.
anonimb84a2f6fd141 09.10.2013 21:24 # 0
bormand 09.10.2013 21:28 # 0
Откуда я его знаю?
Он вбит намертво на этапе компиляции? Ну так я выше и написал, что в таких случаях эти функции имеют право на жизнь.
Я вычислил его на основе длины той строки, которую буду в него копировать (и, возможно, выделил под него память)? Ну и зачем я тогда буду замерять ее второй раз? Длина мне и так известна.
Мне похуй, что строка обрежется, лишь бы не было buffer overrun'ов и оверхеда на замер/хранение длины строк. Ну вот в этом случае strncpy прокатит.
Dummy00001 10.10.2013 14:09 # 0
копирование блоков памяти известного размера делается по 4/8/16/больше байт подряд - потому что на ноль проверять не надо и размер заранее известен и нет шансов случайно выйты за пределы буффера.
на современных системах, с кэшами и прочими оптимизациями на уровне CPU, народ очень очень сильно изгаляется для того что бы достичь максимального бэндвидса шины памяти - именно для чего memcpy() и оптимизируется. типичная реализация memcpy() на порядок сложнее типичной реализации strcpy().
anonimb84a2f6fd141 10.10.2013 18:47 # 0
Dummy00001 10.10.2013 19:01 # 0
я сравнивал memcpy() vs. strcpy(), а не strlen()+memcpy() vs. strcpy().
можно было бы как-нибудь бенчнуть, но мне лень. лично я все равно предпочитаю snprintf() для таких целей (потому что отдельно-стоящее копирование строк редко встречается).
bormand 10.10.2013 19:26 # 0
Например храня ее рядом с самой строкой. Или как побочный эффект во время расчета длины буфера, в который будем копировать.
Т.е. strlen + malloc + memcpy vs strlen + malloc + strcpy.
Вот в этой ситуации strcpy всяко проиграет.
P.S. А strcat/strncat вообще Шмелиэль изобрел. Разве так трудно было вернуть указатель на терминатор, а не бесполезный указатель на начало буфера? ;)
anonimb84a2f6fd141 10.10.2013 19:34 # 0
Ну так strcpy для сишных строк сделали, а не для пасцалевских :)
bormand 10.10.2013 19:41 # 0
А второй мой аргумент (как побочный эффект во время расчета длины буфера) опровергать не будем? :)
anonimb84a2f6fd141 11.10.2013 00:24 # 0
kegdan 11.10.2013 02:47 # +1
bormand 11.10.2013 05:39 # 0
Ну а куда деваться. Либо длина ограничена во время компиляции, либо ты получишь buffer overrun (strcpy без замера), либо у тебя обрежется конец строки (strncpy без замера), либо так как ты описал (strlen + malloc + mempy), либо ты хранишь длину аля пасцаль-строка.
Ну и кто мешает юзать паскалевскую строку? Ну кроме того, что придется запилить несколько простейших функций для работы с ними. Сишка это все-таки не инструмент для прикладника, в котором все из коробки, как в том же питоне...
> В Сишке строк нет.
Угу. Есть только строковые литералы. И несколько функций по обработке массивов как строк ;)
kegdan 11.10.2013 09:36 # 0
не тру. А вообще строки нужны только на уровне view. как правило если в проге где то еще есть строки - она говно
kegdan 11.10.2013 09:38 # 0
roman-kashitsyn 11.10.2013 09:42 # 0
Ты же пишешь на шарпе, изучай F#, потом и до Haskell, глядишь, доберёшься.
kegdan 11.10.2013 09:51 # 0
roman-kashitsyn 11.10.2013 10:00 # 0
Польза от него в основном образовательная, море бесплатного фана и вынос мозга гарантированы. Я иногда пишу на нём небольшие одноразовые утилитки по работе. Собственно, по причине (пока ещё?) низкой потребности в Хаскеле я и предлагаю начать с F#.
guest 11.10.2013 14:35 # −13
guest 11.10.2013 14:35 # −14
guest 11.10.2013 14:35 # −14
guest 11.10.2013 14:36 # −14
guest 11.10.2013 14:36 # −14
guest 11.10.2013 14:37 # −14
Stertor 09.10.2013 21:43 # −1
:D
Qwertiy 09.10.2013 21:32 # +1
bormand 09.10.2013 21:39 # 0
myaut 10.10.2013 07:59 # +2
TarasB 10.10.2013 09:42 # +7
laMer007 10.10.2013 11:36 # −1
roman-kashitsyn 10.10.2013 11:38 # +3
roman-kashitsyn 10.10.2013 11:40 # +5
bormand 10.10.2013 12:26 # +1
roman-kashitsyn 11.10.2013 13:09 # +1
bormand 11.10.2013 15:19 # 0
roman-kashitsyn 11.10.2013 15:25 # +1
Я сначала тоже хотел похоже написать, но вспомнил, что на порядок вычисления аргументов полагаться нельзя.
Но ведь царь должен знать свой компилятор, поэтому волен свободно пользоваться ub по своему усмотрению.
bormand 11.10.2013 15:27 # +1
crastinus 11.10.2013 11:26 # 0
char name = alloca(strlen(pName));
roman-kashitsyn 11.10.2013 11:31 # +1
crastinus 11.10.2013 12:10 # +4
roman-kashitsyn 11.10.2013 15:39 # +1
guest 11.10.2013 16:23 # +1
Dummy00001 11.10.2013 16:24 # 0
guest 11.10.2013 17:15 # +1
Что оно делает в emacs 23?
roman-kashitsyn 11.10.2013 17:20 # 0