Salinan wikimirror

Ini adalah mirror wiki di pascal.chat. Penyuntingan, riwayat, dan proses masuk ada di sana.

Avoiding implicit try finally section/id

Bahasa Indonesia · English · Suomi · Русский

Adakalanya berguna untuk mengetahui bahwa kompilator dapat melapisi beberapa kode dalam blok implisit try ... finally. Intinya ini diperlukan saat anda menggunakan variabel tipe apapun yang harus diinisialisasi / difinalisasi (misalnya prosedur standar Initialize() dan Finalize() melakukan sesuatu yang berarti dengannya), seperti AnsiString atau Variant atau array dinamis. Atau (hanya dalam FPC sebelum tertanggal 2004-12-26) resource string.

Contohnya prosedur seperti

pascal
procedure P;
var S: AnsiString;
begin
 ... do something with S ...
end;

sebenarnya dikompilasi seperti

pascal
procedure P;
var S: AnsiString;
begin
 Initialize(S);
 try
  ... do something with S ...
 finally Finalize(S) end;
end;

Ini diperlukan, untuk memastikan jumlah referensi dari S yang akan dikurangi dengan benar saat prosedur P kan keluar dengan eksepsi. Tapi dalam beberapa kasus ini dapat mempengaruhi secara signifikan kecepatan atas kode yang diberikan.

Ini adalah link ke diskusi yang diarsipkan pada daftar fpc-devel berkenaan dengan isu ini, dengan subyek "TList slowness in classes" : http://www.mail-archive.com/fpc-devel@lists.freepascal.org/msg01367.html

Catatan bahwa ansistring temp vars dapat dibuat secara implisit. Cara yang paling nyata untuk memastikan apa yang terjadi padanya adalah membaca output asm.

Solusi yang Mungkin

Program Demo

Dan di bawah ini adalah program demo kecil yang

text
Time of Foo_Normal: 141
Time of Foo_Faster: 17

From the Free Pascal wiki, page "Avoiding implicit try finally section/id", as it stood on 2015-07-22 after a change by FTurtle, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revisi 3, terakhir diubah oleh WikiArchive .