в сгенерированном коде ассемблерного:.
- указателя (aString)^ будет передавать адрес строки непосредственно к процедуре/функция/метод;
- aString [1] вызовет UniqueString, затем передайте строковый адрес процедуре/функции/методу.
Так указатель (aString)^ следует использовать, если вы собираетесь читать данные, но не изменять его.
И aString [1] должен использоваться, если вы собираетесь изменить aString в вызываемой функции.
На практике я использую указатель (aString)^, который производит более эффективный код.
Обратите внимание, что эта неявная UniqueString не так медленно: если текущий счетчик ссылок строки равна 1 (что означает, что есть только одна часть вашего кода, используя строку, которая весьма вероятно), то она возвращает немедленно. Но есть префикс LOCK asm в UniqueString, используемый для проверки значения счетчика ссылок, и использование этого LOCK asm не является многопоточным. Вот почему я стараюсь избегать использования aString [1], когда я кодирую.
Дополнительное примечание: если aString является '', указатель (aString) вернет ноль.
«Это часть помощника класса для TStream». Мой код также относится к моему помощнику класса. Хотя я был уверен, что он не будет работать с Delphi 2010, если я не изменю строку на AnsiString (что я просто недавно). Хотя, я не очень заинтересован в сохранении UNICOE, я признаю, что я обновлю свой код (используя ваш) для поддержки UNICODE. Благодарю. – Ampere
Версия SourceString [1] более читаема - Спасибо за подтверждение Мейсон. Я нашел код на веб-сайте Borland, и я подумал: «Это должно быть что-то с ним, если они дают его в качестве примера». Какой смысл делать это сложнее, чем нужно? – Ampere
Когда вы включили проверку диапазона (и вы всегда должны иметь проверку диапазона), тогда 'SourceString [1]' будет вызывать исключение, когда длина равна нулю, тогда как 'Pointer (SourceString)' будет нулевым указателем, и что не будет разыменовываться, поскольку счет байта, который вы передаете, также равен нулю. См. * Листинг 4 * на [моем веб-сайте] (http://www.cs.wisc.edu/~rkennedy/string-stream). –