Длина Max для динамического массива в Delphi?

Вам нужно использовать регулярное выражение?

return new String(input.Where(Char.IsDigit).ToArray());
5
задан David Heffernan 9 April 2014 в 18:25
поделиться

3 ответа

Ответ ясен из процедуры System.DynArraySetLength, из строки 20628:

Inc(neededSize, Sizeof(Longint)*2);
if neededSize < 0 then
  Error(reRangeError);

Максимальное значение, которое вы можете выделить, не вызывая ошибки проверки диапазона, теоретически составляет Maxint - SizeOf (Longint) * 2 На практике вы получите ошибку нехватки памяти в зависимости от того, сколько памяти доступно.

18
ответ дан 18 December 2019 в 06:23
поделиться

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

Размер структуры данных и содержащихся в ней данных имеет быть меньше, чем максимальная память, которую может выделить приложение, за вычетом памяти, необходимой для самого кода приложения, стека и других данных. В Windows (32-разрядная версия, единственная версия, которую мы, простые смертные, можем нацелить на Delphi прямо сейчас), это диапазон виртуальных адресов размером 2 ГБ или 3 ГБ со специальным переключателем для загрузчика ОС для каждого приложения. Однако я не уверен, что приложение Delphi может даже обрабатывать пространство памяти 3 ГБ, поскольку последняя треть будет иметь отрицательные значения для смещений во всех местах, где используются целые числа вместо LongWords.

Таким образом, вы можете попытаться выделить динамический массив, скажем, 80% или 90% от MaxInt div SizeOf (элемент массива) - с наиболее вероятным результатом, что выделение этого блока памяти не удастся во время выполнения.

Также: указание длины int64 и отсутствие исключения не означает, что массив имеет заданную длину. Рассмотрим этот код:

procedure TForm1.Button1Click(Sender: TObject);
var
  a: array of byte;
  l: int64;
begin
  l := $4000000000;
  SetLength(a, l);
  Caption := IntToStr(Length(a));
end;

Если проверка диапазона отключена, он будет компилироваться без подсказок и предупреждений и выполняться без исключений. Только небольшая проблема заключается в том, что после вызова SetLength () массив имеет длину 0. Поэтому для проверок в вашем вопросе вы обязательно должны прочитать длину динамического массива после успешного SetLength () , это единственный способ убедиться, что компилятор и среда выполнения сделали то, что вы планировали.

указание длины int64 и отсутствие исключения не означает, что массив имеет заданную длину. Рассмотрим этот код:

procedure TForm1.Button1Click(Sender: TObject);
var
  a: array of byte;
  l: int64;
begin
  l := $4000000000;
  SetLength(a, l);
  Caption := IntToStr(Length(a));
end;

Если проверка диапазона отключена, он будет компилироваться без подсказок и предупреждений и выполняться без исключений. Только небольшая проблема заключается в том, что после вызова SetLength () массив имеет длину 0. Поэтому для проверок в вашем вопросе вы обязательно должны прочитать длину динамического массива после успешного SetLength () , это единственный способ убедиться, что компилятор и среда выполнения сделали то, что вы планировали.

указание длины int64 и отсутствие исключения не означает, что массив имеет заданную длину. Рассмотрим этот код:

procedure TForm1.Button1Click(Sender: TObject);
var
  a: array of byte;
  l: int64;
begin
  l := $4000000000;
  SetLength(a, l);
  Caption := IntToStr(Length(a));
end;

Если проверка диапазона отключена, он будет компилироваться без подсказок и предупреждений и выполняться без исключений. Только небольшая проблема заключается в том, что после вызова SetLength () массив имеет длину 0. Поэтому для проверок в вашем вопросе вы обязательно должны прочитать длину динамического массива после успешного SetLength () , это единственный способ убедиться, что компилятор и среда выполнения сделали то, что вы планировали.

Только небольшая проблема заключается в том, что после вызова SetLength () массив имеет длину 0. Поэтому для проверок в вашем вопросе вы обязательно должны прочитать длину динамического массива после успешного SetLength () , это единственный способ убедиться, что компилятор и среда выполнения сделали то, что вы планировали.

Только небольшая проблема заключается в том, что после вызова SetLength () массив имеет длину 0. Поэтому для проверок в вашем вопросе вы обязательно должны прочитать длину динамического массива после успешного SetLength () , это единственный способ убедиться, что компилятор и среда выполнения сделали то, что вы планировали.

5
ответ дан 18 December 2019 в 06:23
поделиться

Обратите внимание, что количество элементов afaik также ограничено, более 2 ^ 31-1 маловероятно. Возможно, размер имеет такой же предел (чтобы избежать проблем со знаком <> без знака в RTL). Я сомневаюсь, что даже в режиме / 3 ГБ возможно более 2 ГБ.

1
ответ дан 18 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

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