Const Record mit doppelten Werten wird nicht optimiert.

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Const Record mit doppelten Werten wird nicht optimiert.

Beitrag von Mathias »

Ich habe folgendes Testprogramm geschrieben. Da werden 3 verschiedene Strings in den Record gepackt.

Code: Alles auswählen

program Project1;

{$OPTIMIZATION ON}

const
 s1='1fjasdfjkladshfjkdsafhdskjfhadsjklfdgasfkljasgfkdasfgaksdfdaksjfhaksldfhksljaklkldsaghjklsfdghjhgfhgfhfhfhgfhghgfhgfhgghklfdsgahjklfdasgklfdashjklfdshjkkdlghfdkslj';
 s2='2dfdsfdsaffjasdfjkladshfjkdsafhdskjfhadsjklfdgasfkljasgfkdasfgaksdfdakshaksldfhdaksljaklkldsaghjklsfdghjklfdsgahjklfdasghklfdashgjklfdshjkkdlghfdsljdsfdsafdasfdsaf';
 s3='3dfdsfdsaffjasdfjkladshfjkdsafhdskjffgfdgklfdgasfkljasgfkdasfgaksdfdaksjaksldfhdaksljaklkldsaghjklsfdghjklfdsgahjklfdasghklfdashgjklfdshjkkdlghfdsljdsfdsafdasfdsaf';

type
  Tsr=  record
    ss1:String;
    ss2:String;
    ss3:String;
  end;

const
  sr:Tsr =
    (ss1:s1; ss2:s2; ss3:s3); // 3 verschiedene Strings

begin
  WriteLn(sr.ss1);
  WriteLn(sr.ss2);
  WriteLn(sr.ss3);
end.
Packe ich aber 3 mal den gleichen String in den Record, bleibt die EXE immer noch gleich gross.

Code: Alles auswählen

const
  sr:Tsr =
    (ss1:s1; ss2:s1; ss3:s1); // 3 gleiche Strings
Woran liegt das ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Const Record mit doppelten Werten wird nicht optimiert.

Beitrag von fliegermichl »

Weil es keine echte Konstante sondern nur eine initialisierte Variable ist.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Const Record mit doppelten Werten wird nicht optimiert.

Beitrag von Winni »

Hi!

Und wenn Du den Debug-Modus anstellst, dann findet er den Strring nicht nur dreimal sondern viermal!

Winni

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Const Record mit doppelten Werten wird nicht optimiert.

Beitrag von Socke »

Versuch mal den Compiler-Schalter {$WriteableConst OFF}. Dann hast du echte Konstanten.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Const Record mit doppelten Werten wird nicht optimiert.

Beitrag von Winni »

Socke hat geschrieben:
Mi 16. Mär 2022, 18:06
Versuch mal den Compiler-Schalter {$WriteableConst OFF}. Dann hast du echte Konstanten.
Hi!

Nö, das ergibt auch drei Treffer

Winni

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Const Record mit doppelten Werten wird nicht optimiert.

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mi 16. Mär 2022, 14:09
Woran liegt das ?
So wie dein Programm aktuell aussieht, sind die Strings vom Typ ShortString. Diese können für ein Record nicht über 'nen Pool genutzt werden, da diese Teil des Speicherlayouts des Records sind.

Für die anderen Stringtypen (v.a. AnsiString und UnicodeString) wird das bei Konstanten aktuell einfach nicht gemacht (im Gegensatz zu normalen Zuweisungen zum Beispiel). Du kannst ja 'nen Bugreport dafür einreichen, damit es nicht vergessen wird.
FPC Compiler Entwickler

Antworten