Основы струнных - PullRequest
       8

Основы струнных

0 голосов
/ 20 июня 2010

Хорошо, я всегда знал, что компьютеры рассматривают строки как последовательность чисел под обложками, но я никогда не задумывался о деталях, как это работает.Какая магия происходит в обычном компиляторе / процессоре, когда мы делаем, например, следующее?

string myString = "foo";
myString += "bar";
print(myString) //replace with printing function of your choice

Ответы [ 4 ]

1 голос
/ 20 июня 2010

Реализация варьируется в зависимости от языка и компилятора, но обычно для C это примерно так. Обратите внимание, что строки по сути являются синтаксическим сахаром для массивов символов (char[]) в C.

1

string myString = "foo";
  • Выделите 3 байта памяти для массива и установите значение 1-го байта равным «f» (точнее, его ASCII-код), 2-го байта - «o», 2-го байта - «o».

2

foo += "bar";
  • Считать существующую строку (массив символов) из памяти, на которую указывает foo.

  • Выделите 6 байтов памяти, заполните первые 3 байта прочитанным содержимым foo, а следующие 3 байта b, a и r.

3.

print(foo)
  • Считайте строку foo, которая теперь указывает на память, и распечатайте ее на экране.

Это довольно грубый обзор, но, надеюсь, должен дать вам общее представление.

Примечание: В некоторых языках / компиляторах char! = Byte - например, C #, где строки хранятся в формате Unicode по умолчанию и, в частности, длина строки также сохраняется в памяти , C ++ обычно использует строки с нулевым символом в конце, что решает проблему другим способом, хотя это означает, что определение его длины - O (n), а не O (1).

1 голос
/ 20 июня 2010

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

В С:

В C строки являются массивом char с 0 в конце:

char str[1024];
strcpy(str, "hello ");
strcpy(str, "world!");

За кулисами str [0] == 'h' (значение int), str [1] == 'e', ​​... str [11] == '!', str [12] == '\ 0';

Символ - это просто число, которое может содержать одно из 256 значений. Каждый символ имеет числовое значение.

В C ++:

Строки

поддерживаются так же, как C, но у вас также есть тип string, который является частью STL.

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

Это зависит от реализации, как строковый тип на самом деле работает за кулисами, но сами строковые объекты являются изменяемыми.

В C #:

строки являются неизменяемыми. Это означает, что вы не можете напрямую изменить строку после ее создания. Когда вы делаете + =, что происходит, если создается новая строка, и ваша строка теперь ссылается на эту новую строку.

0 голосов
/ 20 июня 2010

Я предполагаю опечатку в вашем образце и что есть только одна переменная с именем foo или myString, а не две переменные?

Я бы сказал, что многое будет зависеть от того, какой компилятор вы используете. В .Net строки являются неизменяемыми, поэтому, когда вы добавляете «bar», вы на самом деле не добавляете ее, а скорее создаете новую строку, содержащую «foobar», и говорите ей поместить ее в переменную. На других языках это будет работать по-другому.

0 голосов
/ 20 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...