Добавить комментарий

Delphi

Сколько элементов влезет в TList

Каждый элемент - указатель. Четыре байта. Процесс может адресовать до 2Гб. 

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

Проверяем:

program Test;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Classes,
  System.SysUtils,
  System.Diagnostics;

const
  cTestSize  = 1000000000;

procedure MaxElement;
var
  i : Integer;

begin
  i := 0;
  list := TList.Create;
  Try
    while i < cTestSize do
    begin
      list.Add(nil);
      inc(i);
    end;
  Finally
    WriteLn(Format('Added : %1.0n', [0.0+i]));
    WriteLn(Format('Size  : %1.3n MBytes', [i*SizeOf(list.Items[0])/1024/1024]));
    list.Free;
  End;
end;

begin
  try
    MaxElement;
  except
    on e: exception do
      writeln(e.Message);
  end;
  writeln('I''m finished.');
  readln;
end.

Получаем:

Added : 289 632 570
Size  : 1 104.861 MBytes
Out of memory
I'm finished.

Хм... В реальности, удаётся только перевалить за  один Гб...

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.
  • Вы можете цитировать другие сообщения, используя тэг [quote]

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и абзацы переносятся автоматически.