AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Variablen Definition

Ein Thema von Aphton · begonnen am 22. Jun 2011 · letzter Beitrag vom 22. Jun 2011
Antwort Antwort
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#1

Variablen Definition

  Alt 22. Jun 2011, 19:14
Delphi-Version: 2006
Ein Freund von mir meinte, es macht einen Unterschied, ob man Variablen nach dem Schema A oder Schema B definiert

Delphi-Quellcode:
// A
type
  TMyRecordA = record
    _1: Byte;
    _2: Byte;
    _3: Byte;
    _4: Byte;
  end;

// B
type
  TMyRecordB = record
    _1, _2, _3, _4: Byte;
  end;
Er meinte nämlich, dass bei Variante B für die Vier 1 Byte Elemente nur 1 DWord (also wirklich 4 Bytes) reserviert werden und bei A eben für jedes Feld 4 Bytes (vlt weil dadurch - also 32 Bit - es schneller läuft?)

Stimmt das so? Falls ja, ist das "packed" genau dafür da, damit dies nicht geschieht?

also ist C = B, sofern A <> B
Delphi-Quellcode:
// C
type
  TMyRecordC = packed record
    _1: Byte;
    _2: Byte;
    _3: Byte;
    _4: Byte;
  end;
Edit:
Obwohl --> sizeof(TMyRecordA) = sizeof(TMyRecordB) = sizeof(TMyRecordC).
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (22. Jun 2011 um 19:22 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Variablen Definition

  Alt 22. Jun 2011, 19:23
Ein Freund von mir meinte, es macht einen Unterschied, ob man Variablen nach dem Schema A oder Schema B definiert
[…]
Stimmt das so?
Nein.

Delphi-Quellcode:
program recordalign;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type

  TRec1A = record
    _1: Byte;
    _2: Byte;
    _3: Byte;
    _4: Byte;
  end;

  TRec1B = record
    _1, _2, _3, _4: Byte;
  end;

  TRec1C = packed record
    _1: Byte;
    _2: Byte;
    _3: Byte;
    _4: Byte;
  end;

  // mit integer in der mitte der das alignment beeinflusst:
  TRec2A = record
    _1: Byte;
    _2: Byte;
    _int: integer;
    _3: Byte;
    _4: Byte;
  end;

  TRec2B = record
    _1, _2: Byte;
    _int: integer;
    _3, _4: Byte;
  end;

  TRec2C = packed record
    _1: Byte;
    _2: Byte;
    _int: integer;
    _3: Byte;
    _4: Byte;
  end;

begin
  WriteLn('1 (4 bytes):');
  WriteLn('Record 1A: ', SizeOf(TRec1A));
  WriteLn('Record 1B: ', SizeOf(TRec1B));
  WriteLn('Record 1C: ', SizeOf(TRec1C));
  WriteLn('');
  WriteLn('2 (2 bytes, 1 int, 2 bytes):');
  WriteLn('Record 2A: ', SizeOf(TRec2A));
  WriteLn('Record 2B: ', SizeOf(TRec2B));
  WriteLn('Record 2C: ', SizeOf(TRec2C));
  readln;
end.
Ausgabe:
Code:
1 (4 bytes):
Record 1A: 4
Record 1B: 4
Record 1C: 4

2 (2 bytes, 1 int, 2 bytes):
Record 2A: 12
Record 2B: 12
Record 2C: 8
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Variablen Definition

  Alt 22. Jun 2011, 19:24
Ahh ne habs, also es ist falsch, was er meinte aber das packed (no-Alignment) macht den unterschied bei ner Größe von 4x:
Delphi-Quellcode:
  TMyTypeA = record
    A: Integer;
    B: Byte;
  end;

  TMyTypeB = packed record
    A: Integer;
    B: Byte;
  end;
sizeof(TMyTypeA) 8
sizeof(TMyTypeB) 5

Die Frage hat sich erübrigt =)
Btw ty
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (22. Jun 2011 um 19:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Variablen Definition

  Alt 22. Jun 2011, 19:26
Delphi-Quellcode:
// A
type
  TMyRecordA = record
    _1: Byte;
    _2: Byte;
    _3: Byte;
    _4: Byte;
  end;

// B
type
  TMyRecordB = record
    _1, _2, _3, _4: Byte;
  end;
Er meinte nämlich, dass bei Variante B für die Vier 1 Byte Elemente nur 1 DWord (also wirklich 4 Bytes) reserviert werden und bei A eben für jedes Feld 4 Bytes
Unsinn. Beide Records sind gleich groß. Wird das Schlüsselwort packed nicht verwendet werden die Felder des Records ausgerichtet. Wie sie ausgerichtet werden, kann man mit der Compilerdirektive Align beeinflussen. Wird das Schlüsselwort packed verwendet, liegen sie ohne "Zwischenraum" hintereinander im Speicher. Erstes ermöglicht es der CPU schneller auf die Felder des Rorcords zuzugreifen, weil unter 32 Bit immer 32 Bit aus dem Arbeitsspeicher geholt werden.

Version A und Version B sind identisch, nur unterschiedliche Schreibweisen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Variablen Definition

  Alt 22. Jun 2011, 19:28
Alles klar, war ja auch mein Gedanke
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz