Hallo Tom,
»» > Kann natürlich sein, dass es Compiler gibt, die zu dämlich dafür sind.
»» Das relativiert diese Aussage ein wenig: Die Compiler konnten es, man musste ihnen nur richtig sagen, was man will ...
das fand ich nun doch spannender, als HTML
nicht wahr ...
http://software.intel.com/en-us/articles/intel-c-compiler-array-size-limit-on-ia-32/
Was möchtest du mit diesem Artikel jetzt andeuten? Der geht von Grenzen aus, die für 32bit-Systeme gelten; eben waren wir noch in der 16bit-Welt.
Es ist eine allgemein verunsichernde Frage. Kaum ein Programmierer scheint die Mechanismen im Hintergrund wirklich zu kennen.
Ja, und das finde ich schade.
Selbst Christian schreibt ja: "der Compiler sollte normalerweise Assembler-Code generieren...", hat also vermutlich auch noch nie nachgeschaut.
Ich halte ihm angesichts seines Alters zugute, dass er möglicherweise mit 16bit-Systemen keine allzu intime Bekanntschaft mehr gemacht hat.
Ich möchte nochmals erinnern: Es ging um C, nicht um C++.
Das macht aber nichts, die Mechanismen sind dieselben.
Nach der Lektüre vieler vieler Postings im Internet gehe ich jetzt davon aus, dass bei C die Grenze für ein dynamisch allokiertes Array bei 2^32 Bytes für die gesamte Struktur liegt
Das ist keine prinzipbedingte Einschränkung von C, sondern des Compilers und der Plattform, auf der er läuft bzw. auf der die compilierte Anwendung laufen soll. By the way: Gibt es eigentlich C-Compiler, die auf Linux laufen, aber Windows-Executables erstellen?
(der Intel-Compiler macht ja sogar schon bei signed Integer schlapp), da die interne Adressierung scheinbar nur über das Displacement vorgenommen wird, das wiederum in ein Register passen muss.
Warum die Intel-Leute hier von 2GB als Grenze sprechen, kann ich nicht ganz nachvollziehen. Sicher, man kann argumentieren, dass das Displacement mit gesetztem MSB als negativ aufgefasst wird. Das wäre aber aufgrund des Wraparounds an der 4GB-Grenze des Adressraums auch egal. Vielleicht schreit die CPU dann schon "Protection Violation!"
Selbst für Maschinen mit 64-Bit-Architektur waren sich die Leute nicht einig. Da kann es natürlich dann auch am Compiler gelegen haben.
Haben die heutigen 64bit-CPUs (also IA64) einen 64bit-Adressbus, oder "nur" 64bit Datenbreite? Theoretisch müssten sie auch 64bit-Adressen haben, denn sonst könnten die ja auch wieder "nur" 4GB adressieren. Ich habe aber, ehrlich gesagt, keine Ahnung, wie die Speicherverwaltung und Segmentierung in IA64 organisiert ist. DASS es weiterhin eine Segmentierung gibt, wie auch in IA32, ist logisch, denn nur so kann man jeder Anwendung bzw. jedem Prozess seinen eigenen logischen Adressraum geben.
Ich würde mich freuen, wenn wir das Thema noch etwas vertiefen könnten.
Aber gern doch. :-)
Ciao,
Martin
--
Wichtig ist, was hinten rauskommt.
(Helmut Kohl, 16 Jahre deutsche Bundesbirne)