AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Kleine Integer?

Ein Thema von xZise · begonnen am 29. Jul 2006 · letzter Beitrag vom 31. Jul 2006
Antwort Antwort
Seite 4 von 4   « Erste     234
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#31

Re: Kleine Integer?

  Alt 29. Jul 2006, 23:34
Innerhalb der CPU hast du nur ein paar Register. Der Speicherverbrauch dort ist absolut egal, da man nach ein paar Arbeitsschritten sowieso alles in den RAM speichert.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#32

Re: Kleine Integer?

  Alt 30. Jul 2006, 10:23
So... Der Threadersteller meldet sich auch mal zu Wort:
Eigentlich geht es nur darum, dass ich eigentlich immer "passende" Datentype verwende.
d.h. wenn ich weiß das ein Wert zwischen 40 und 78 zum Beispiel liegt, und es eine Ganzzahl ist, dann werde ich ihn immer als Byte deklarieren... Und deshalb habe ich gefragt ^^, weil ich sozusagen umbedingt einen Byte wollte, mit Vorzeichen (ShortInt).

Aber ihr könnt ruhig weiterdiskutieren Also ich finds interessant, auch wenn ich nicht umbedingt alles verstehe

Mfg
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.262 Beiträge
 
Delphi 2006 Professional
 
#33

Re: Kleine Integer?

  Alt 30. Jul 2006, 11:49
Moin Fabian,

da der Compiler die Daten i.d.R. auf 32-Bit Grenzen ausrichtet verbraucht ein Byte allerdings trotzdem 4-Byte Speicher.
(wenn ich mal von packed record absehe)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#34

Re: Kleine Integer?

  Alt 31. Jul 2006, 09:13
Das tut er nur in einem Record für den schnelleren Zugriff, da er hier nicht erst den Typen der vorherigen Member prüfen muss, um den Offset zu berechnen.
Abgesehen davon legt er ein Byte in eine Speicheradresse, das nächste in die nächste. Bei Word versucht er, eine geradzahlige Speicherzelle zu nehmen (wegen Zugriff, siehe letztn Post), da er den Wert dann in einem Zugriffszyklus laden kann. Bei Integer(int32) nimmt er dann eine Zelle mit durch 4 teilbaren Adresse (selber Grund).
d.h. Du verlierst nur dann Speicher wenn Du abwechselnt Byte und Integer speicherst.

Speicherzellen sind nach wie vor 8 Bit groß, nur der Datenbus ist 32Bit breit, was Dazu führt dass er bis zu 4 Zellen gleichzeitig auslesen kann.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#35

Re: Kleine Integer?

  Alt 31. Jul 2006, 10:45
Zitat von xZise:
Eigentlich geht es nur darum, dass ich eigentlich immer "passende" Datentype verwende.
Hi,
stellt sich für mich die Frage: Warum?
Hab gerade die Delphi-Hilfe nicht zur Hand, aber schau da mal unter Integer in die OH. Da steht sinngemäß, dass du immer Integer oder Cardinal verwenden solltest, wenn du einen solchen Typ brauchst. Ausnahmen sind natürlich Strukturen, die zu etwas bestimmten (z.B. eine C Struct) kompatibel sein müssen.
Jedenfalls lohnt sich der 3 Byte unterschied nicht, hier auf ShortInt zu setzen.

Zwei Sachen wurden hier schon völlig richtig gesagt, den Speicher hast du locker und es möglich Bytes auch einzeln zu addresieren. Die Frage von Vor- und Nachteilen wird ja noch halbwegs diskutiert.
Mir ist nicht ganz klar, wie Leute hier wirklich eine Aussage über die Ausführungsgeschwindigkeit machen wollen. Ob ein Register mit 0en aufgefüllt wird oder nicht, dass liegt nicht in der Hand des Programmierers. Die Jungs von AMD, Intel, Transmeta, IBM, ... entscheiden das für einen. Der Assembler ist letztlich (trotz seiner Hardwarenähe) sehr abstrakt. Man hat einen Befehl mit gewissen Argumenten und bekommt das erwartete Ergebnis, was dazwischen passiert ist eigentlich Sache der CPU. Mag sein, dass sich einige sehr intensiv mit den heutigen Systemen beschäftigt haben (gibt ja ein paar ordentliche bekannte Fakten), aber schon über die nächste Generation kann man nicht mehr eine sichere Aussage treffen (oder man sollte sich schnell einen Job bei einem der Großen suchen!).
So wird man sicherlich weiterhin die Adressierung auch Byte-Weise erlauben. Doch ob bei Addition eine ALU wirklich nach 8 Bit abbricht oder ob sie (was sehr viel wahrscheinlicher ist) einfach alle 32 Bit nahezu parallel berechnet und dann die Überträge mit einbezieht, dass ist das Geheimnis der CPU. Gerade bei den Arithmetischen Operationen wird einiges getan um die Konkurrenz zu übertreffen. Alles was auf einer CPU gemacht wird ist so komplex, dass es wohl nichts für das mal ebend anschauen und verstehen ist. Und letztlich wird keiner der Hersteller die letzten Kniffe und Tricks preisgeben wollen (das ist ihr jeweiliges Kapital!)

Wenn du also irgendeine Operation mit deinen Variablen ausführst, dann kann es gut sein, dass die Werte bevor sie an die ALU gehen mit 0en aufgefüllt sein müssen. Das würde dann etwas Zeit kosten. Die Wahrscheinlichkeit, dass sich diese Nanosekunden auf addieren in einen Bereich den du merkst, ist 0. Dazu finden viel zu wahrscheinlich häufiger Zugriffe auf den Cache und vielleicht sogar auf RAM oder noch schlimmer anderen Speicher (Festplatte, CD-ROM, USB-Stick,...) statt. Diese sind dann um einiges Größer und dominieren selbst häufiges füllen mit 0en total.

Trotzdem lohnt es sich einfach nicht, mit einem so beschränkten Typen zu arbeiten. Ich denke Borland hat seine Gründe, warum eine Empfehlung ausgesprochen wird und im Zweifel sollte man sich ruhig an die halten.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#36

Re: Kleine Integer?

  Alt 31. Jul 2006, 13:35
Es werden keine Register mit nullen aufgefüllt! Wo kämen wir denn da hin?????? das wäre ja tödlich für die Register, wenn eine simple Addition des LowByes das HighByte einfach nullen würde.
Abhängig vom Befehl (es gibt Varianten für ..L, ..H, ..X, E..X) werden nur bestimmte 'Schieber', die vom Register an die ALU gehen geöffnet (eben Schieber für LowByte, HighByte ..). Die restlichen Bits kommen AUTOMATISCH als 0 an. Die ALU rechnet dann mit der vollen Breite und bei der Rückgabe werden wieder nur die entsprechenden Schieber geöffnet, um den Low-, High-, wasauchimmer-Teil des Ergebnisses wieder in das Register zurückzuschieben.
Die Flags für Übertrag, Sign, Zero, usw. werden auch grundsätzlich gesetzt (natürlich wieder abhängig vom Befehl: mit übertrag/ohne Übertrag sind zwei versch. CPU-Befehle).
In der Tat unterscheiden sich die Befehle in der ALU durch nix, nada, niente, rien, nihil, nothing.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf