Что некоторые недостатки к использованию строк C-стиля?

Время выполнения label_image.py также включает загрузку модели классификации, ее десериализацию и загрузку вашего изображения. В производственной среде вам нужна система очередей сообщений, из которой ваш сценарий классификации будет читать и записывать. Вы можете создать его с помощью Redis. Этот конвейер уменьшит накладные расходы ввода-вывода, и у вас будет разумное время классификации. Вы можете увидеть пример здесь

8
задан Bill the Lizard 24 November 2008 в 01:03
поделиться

16 ответов

Струны до испытывают недостаток в следующих аспектах своих дубликатов C++:

  • Автоматическое управление памятью: необходимо выделить и освободить их память вручную.
  • Дополнительная способность к эффективности конкатенации: строки C++ часто имеют способность, больше, чем их размер. Это позволяет увеличивать размер без многих перераспределений.
  • Нет встроенный NULs: по определению символ NUL заканчивает струну до; строка C++ сохраняет внутренний счетчик размера, таким образом, им не нужно специальное значение для маркировки их конца.
  • Разумное сравнение и операторы присваивания: даже при том, что сравнение указателей струны до разрешено, это почти всегда не, что было предназначено. Точно так же присваивающиеся указатели струны до (или передача их к функциям) создают неоднозначности владения.
16
ответ дан 5 December 2019 в 04:28
поделиться

Другое соображение состоит в том, кто будет поддерживать Ваш код? Что относительно за два года? Тот человек будет так же доволен строками C-stlye, как Вы? Поскольку STL становится более сформировавшимся, кажется, что люди будут все больше более довольны со строками STL, чем со строками C-стиля.

0
ответ дан 5 December 2019 в 04:28
поделиться

Струны до, как много других аспектов C, дают Вам много комнаты для зависания себя. Они просты и быстры, но небезопасны в ситуации, где предположения, такие как пустой разделитель могут быть нарушены или введены, может превысить буфер. Чтобы сделать их надежно, необходимо наблюдать справедливо hygenic кодирование методов.

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

0
ответ дан 5 December 2019 в 04:28
поделиться

Этот вопрос не, действительно имеют ответ.
Если Вы пишущий в C, что по опциям Вы имеете?
Если Вы пишущий в C++, почему Вы спрашиваете? Что причина не состоит в том, чтобы использовать примитивы C++?
Единственная причина я могу думать: Соединение C и код C++ и имеют символ * где-нибудь в интерфейсах. Это иногда просто простой в использовании символ * вместо этого выполнение преобразования назад и вперед все время (особенно, если это - действительно 'хороший' код C++, которые имеют 3 различных строковых типа объектов C++).

0
ответ дан 5 December 2019 в 04:28
поделиться

По моему скромному мнению, самая твердая точка cstrings является управлением памятью, потому что необходимо быть тщательно, если необходимо передать копию cstring или если можно передать литерал функции, т.е. будет функция освобождать переданную строку, или будет это сохранять ссылку дольше затем для вызова функции. То же относится к возвращаемым значениям cstring.

Таким образом без большого усилия не возможно совместно использовать копии cstring. Это заканчивается во многих случаях ненужными копиями того же cstring в памяти.

0
ответ дан 5 December 2019 в 04:28
поделиться

струны до имеют возможности для неправильного употребления, вследствие того, что тот должен просканировать строку для определения, где это заканчивается.

strlen - для нахождения длины просканируйте строку, пока Вы не поражаете NUL, или доступ защитил память

strcat - должен просканировать для нахождения NUL, для определения, где начать конкатенировать. Нет никакого знания в струне до, чтобы сказать, будет ли переполнение буфера или нет.

струны до опасны, но обычно быстрее, чем строковые объекты.

0
ответ дан 5 December 2019 в 04:28
поделиться

Я думаю, что IT должен ХОРОШО использовать их, people've использование их в течение многих лет. Но я использовал бы станд.:: представьте в виде строки, если возможный, потому что 1) Вы не должны быть настолько осторожными каждый раз и можете думать о проблемах своего домена, вместо того, чтобы думать, что необходимо добавить другой параметр каждый раз... управление памятью и такой материал... просто более безопасно кодировать на более высоком уровне... 2) существуют, вероятно, некоторые другие небольшие проблемы, которые не являются грандиозным предприятием, но все еще... как люди, уже упомянутые... кодирование, unicode... все они "связанный" вид людей материала, создающих станд.:: строковая мысль... :)

Обновление

Я работал над проектом в течение половины года. Так или иначе я был достаточно глуп никогда не скомпилировать в режиме выпуска перед доставкой.... :) Хорошо... к счастью была всего одна ошибка, которую я нашел после 3 часов. Это было переполнение буфера очень простой строки.

2
ответ дан 5 December 2019 в 04:28
поделиться

В Вашем конкретном случае это не струна до, настолько опасная, так как чтение неопределенного объема данных в буфер фиксированного размера. Никогда не используйте добирается (символ*), например.

Смотрение на Ваш пример, хотя, это не кажется вообще корректным - пробует это:

char buffer[1024];
char * line = NULL;
while ((line = fgets(buffer, sizeof(buffer), fp)) != NULL) {
    // parse one line of command output here.
}

Это - совершенно безопасное использование струн до, хотя необходимо будет иметь дело с возможностью это line не содержит всю строку, но был довольно усеченным к 1 023 символам (плюс пустой разделитель).

3
ответ дан 5 December 2019 в 04:28
поделиться

Никакая поддержка Unicode не является причиной достаточно в эти дни...

2
ответ дан 5 December 2019 в 04:28
поделиться

Ну, для комментария определенного примера Вы не знаете, что данные, возвращенные Вашим вызовом к df, впишутся в Ваш буфер. Никогда не доверяйте входу un-sanatized в свое приложение, даже когда это, предположительно, из известного источника как df.

Например, если программа, названная 'df', помещается куда-нибудь в Вашем пути поиска так, чтобы это было выполнено вместо системы df, это могло использоваться для использования ограничения буфера. Или если df заменяется вредоносной программой.

Когда вход чтения из файла использует функцию, которая позволяет Вам указать максимальное количество байтов для чтения. Под OSX и Linux fgets () на самом деле определяется как char *fgets(char *s, int size, FILE *stream); таким образом, было бы безопасно использовать в тех системах.

6
ответ дан 5 December 2019 в 04:28
поделиться

Можно знать, что сегодня 1 024 байтов достаточно для содержания любого входа, но Вы не знаете, как вещи изменятся завтра или в следующем году.

Если преждевременная оптимизация является корнем всего зла, магические числа являются основой.

8
ответ дан 5 December 2019 в 04:28
поделиться

Нет никакого способа встроить символы NUL (при необходимости в них для чего-то) в строки стиля C.

6
ответ дан 5 December 2019 в 04:28
поделиться

Управление памятью и т.д. должно было вырастить строку (массив символов), при необходимости, является довольно скучным для переосмысления.

7
ответ дан 5 December 2019 в 04:28
поделиться

Наличие длины, доступной в постоянно-разовом, является серьезными издержками во многих приложениях.

14
ответ дан 5 December 2019 в 04:28
поделиться

Существует несколько недостатков к струнам до:

  1. Получение длины является относительно дорогой операцией.
  2. Нет встроенные nul символы позволяются.
  3. Со знаком из символов является определенная реализация.
  4. Набор символов является определенной реализацией.
  5. Размер символьного типа является определенной реализацией.
  6. Должны отслеживать отдельно то, как каждая строка выделяется и поэтому как это должен быть free'd, или даже если это должен быть free'd вообще.
  7. Никакой способ назвать часть строки как другая строка.
  8. Строки не неизменны, означая, что они должны синхронизироваться отдельно.
  9. Строками нельзя управлять во время компиляции.
  10. Случаи переключателя не могут быть строками.
  11. Препроцессор C не распознает строки в выражениях.
  12. Не может передать строки как аргументы шаблона (C++).
20
ответ дан 5 December 2019 в 04:28
поделиться

Проблемы кодировки символов имеют тенденцию появляться, когда у Вас есть массив байтов вместо строки символов.

3
ответ дан 5 December 2019 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: