Различие между строкой и символом [] вводит в C++

$app = Get-WmiObject -Class Win32_Product | Where-Object { 
    $_.Name -match "Software Name" 
}

$app.Uninstall()

Править: Ограбьте нашел другой способ сделать это с параметром Фильтра:

$app = Get-WmiObject -Class Win32_Product `
                     -Filter "Name = 'Software Name'"
118
задан ramosg 18 August 2009 в 22:20
поделиться

4 ответа

Массив символов - это просто массив символов:

  • Если он размещен в стеке (как в вашем примере), он всегда будет занимать, например. 256 байт вне зависимости от длины содержащегося в нем текста - это
  • . Если он выделен в куче (с помощью malloc () или new char []), вы несете ответственность за высвобождение памяти впоследствии, и у вас всегда будут накладные расходы на выделение кучи. .
  • Если вы скопируете текст, состоящий из более чем 256 символов, в массив, он может дать сбой, вызвать уродливые сообщения с утверждениями или вызвать необъяснимое (неправильное) поведение где-то еще в вашей программе.
  • Чтобы определить длину текста, массив должен сканироваться символ за символом для символа \ 0.

Строка - это класс, который содержит массив символов, но автоматически управляет им за вас. Большинство строковых реализаций имеют встроенный массив из 16 символов (поэтому короткие строки не фрагментируют кучу) и используют кучу для более длинных строк.

Вы можете получить доступ к строковому массиву символов следующим образом:

std::string myString = "Hello World";
const char *myStringChars = myString.c_str();

Строки C ++ могут содержат встроенные символы \ 0, знают их длину без подсчета, работают быстрее, чем массивы символов из кучи для коротких текстов, и защищают вас от переполнения буфера. Кроме того, они более читабельны и проще в использовании.

-

Однако строки C ++ не (очень) подходят для использования через границы DLL, потому что это потребует от любого пользователя такой функции DLL, чтобы убедиться, что он использует тот же самый компилятор и реализация среды выполнения C ++, чтобы он не рисковал, что его строковый класс будет вести себя иначе.

Обычно строковый класс также освобождает свою память кучи в вызывающей куче, поэтому он сможет снова освободить память, только если вы используете общую (.dll или .so) версию среды выполнения.

Вкратце: используйте строки C ++ во всех ваших внутренних функциях и методах. Если вы когда-нибудь пишете .dll или .so, используйте строки C в своих публичных (dll / so-visible) функциях.

168
ответ дан 24 November 2019 в 01:58
поделиться

Аркаитц прав, что строка - управляемый тип. Для вас это означает, что вам не нужно беспокоиться о длине строки, а также об освобождении или перераспределении памяти строки.

С другой стороны, Нотация char [] в приведенном выше случае ограничила символьный буфер ровно 256 символами. Если вы попытались записать в этот буфер более 256 символов, в лучшем случае вы перезапишете другую память, которой «владеет» ваша программа. В худшем случае вы попытаетесь перезаписать память, которой вы не владеете, и ваша ОС сразу же убьет вашу программу.

Итог? Строки намного удобнее для программистов,

11
ответ дан 24 November 2019 в 01:58
поделиться

Я лично не вижу причин, по которым можно было бы использовать char * или char [], за исключением совместимости со старым кодом. std :: string не медленнее, чем использование c-строки, за исключением того, что он будет обрабатывать перераспределение для вас. Вы можете установить его размер при создании и, таким образом, избежать перераспределения, если хотите. Его оператор индексации ([]) обеспечивает постоянный доступ по времени (и во всех смыслах этого слова то же самое, что и использование индексатора c-строк). Использование метода at также дает вам проверенные границы безопасности, чего вы не получите с c-строками, если вы не напишете его. Ваш компилятор чаще всего оптимизирует использование индексатора в режиме выпуска. С до-струнами легко возиться; такие вещи, как delete vs delete [], безопасность исключений, даже как перераспределить c-строку.

5
ответ дан 24 November 2019 в 01:58
поделиться

Ну, строковый тип - это полностью управляемый класс для символьных строк, в то время как char [] по-прежнему тот же, что и в C, байтовый массив, представляющий для вас символьную строку.

В терминах API и стандартной библиотеки все реализовано в терминах строк, а не char [], но есть еще много функций из libc, которые получают char [], поэтому вам может потребоваться использовать его для них, кроме этого я всегда буду использовать std :: string.

С точки зрения эффективности, конечно, необработанный буфер неуправляемой памяти почти всегда будет быстрее для многих вещей, но примите во внимание сравнение строк, например, std :: string всегда имеет размер для проверки сначала, а с char [] вам нужно сравнивать символ за символом.

6
ответ дан 24 November 2019 в 01:58
поделиться
Другие вопросы по тегам:

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