Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2011-06

When the variable freed in Optimize compile

7 messages · 5 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Zaher Dirkey

Hi, I know when compile the project with optimize in Delphi the variable freed/allocated after the last line used.
How can i make same in FPC, O3 not worked for me.
I used FPC 2.4.4

var
  c: Currency;
begin
   c := 10;
   writeln(c);
<<now c freed
   some code here
end;

Thanks in advance.

Zaher Dirkey

Reply by email

Jonas Maebe
to Zaher Dirkey
Zaher Dirkey wrote
Hi, I know when compile the project with optimize in Delphi the variable freed/allocated after the last line used. How can i make same in FPC, O3 not worked for me.

FPC only reuses stack slots allocated for temporary expressions. It does not reuse stack slots used by variables.

Jonas

Reply by email

Unknown author
to Zaher Dirkey: Hi, I know when compile the project with optimize in Delphi the variable freed/allocated…
Zaher Dirkey wrote 13 lines
Hi, I know when compile the project with optimize in Delphi the variable freed/allocated after the last line used. How can i make same in FPC, O3 not worked for me. I used FPC 2.4.4 var c: Currency; begin c := 10; writeln(c); <<now c freed some code here end;

C (as a currency) is never 'freed'. It is declared throughout the whole procedure.

Michael.

Reply by email

Zaher Dirkey
to Unknown author
Show quoted text 22 lines
On Wed, 8 Jun 2011, Zaher Dirkey wrote: Hi, I know when compile the project with optimize in Delphi the variable > freed/allocated after the last line used. > How can i make same in FPC, O3 not worked for me. > I used FPC 2.4.4 > > var > c: Currency; > begin > c := 10; > writeln(c); > <<now c freed > some code here > end; > C (as a currency) is never 'freed'. It is declared throughout the whole procedure.

What if C is string or Interface of TInterfacedObject?

Thanks

Zaher Dirkey

Reply by email

Martin
to Zaher Dirkey
Zaher Dirkey wrote 28 lines
On Wed, Jun 8, 2011 at 11:22 AM, < > wrote: On Wed, 8 Jun 2011, Zaher Dirkey wrote: Hi, I know when compile the project with optimize in Delphi the variable freed/allocated after the last line used. How can i make same in FPC, O3 not worked for me. I used FPC 2.4.4 var c: Currency; begin c := 10; writeln(c); <<now c freed some code here end; C (as a currency) is never 'freed'. It is declared throughout the whole procedure. What if C is string or Interface of TInterfacedObject?

Read the following threads, it has been lengthly discussed before:

http://lists.freepascal.org/lists/fpc-devel/2010-November/022806.html http://lists.freepascal.org/lists/fpc-devel/2010-November/022867.html

there may be more threads by the same subject

Reply by email

Unknown author
to Zaher Dirkey: What if C is string or Interface of TInterfacedObject? Thanks Zaher Dirkey
Zaher Dirkey wrote 26 lines
On Wed, Jun 8, 2011 at 11:22 AM, wrote: > > > On Wed, 8 Jun 2011, Zaher Dirkey wrote: > > Hi, I know when compile the project with optimize in Delphi the variable >> freed/allocated after the last line used. >> How can i make same in FPC, O3 not worked for me. >> I used FPC 2.4.4 >> >> var >> c: Currency; >> begin >> c := 10; >> writeln(c); >> <<now c freed >> some code here >> end; >> > > C (as a currency) is never 'freed'. It is declared throughout the whole > procedure. > What if C is string or Interface of TInterfacedObject?

It is the same logic. It's freed only at the end.

For compiler-generated temporary variables, you should not make any assumptions.

Michael.

Reply by email

Flávio Etrusco
to Jonas Maebe: FPC only reuses stack slots allocated for temporary expressions. It does not reuse stack…
Jonas Maebe wrote 13 lines
On 08 Jun 2011, at 10:57, Zaher Dirkey wrote: > Hi, I know when compile the project with optimize in Delphi the variable > freed/allocated after the last line used. > How can i make same in FPC, O3 not worked for me. FPC only reuses stack slots allocated for temporary expressions. It does not reuse stack slots used by variables. Jonas

While we are at it, is this a limitation or by design?

> What if C is string or Interface of TInterfacedObject? It is the same logic. It's freed only at the end.

I recently noticed that this is also true for ansistrings. I see this can avoid lots of errors, but also makes it very ackward to intentionally avoid copies when modifying strings in-place if they are obtained from a function...

-Flávio

Reply by email