Größe der Speicher
-
WCHAR a[8]; // hier mit sizeof(a) die grösse ermittelt ist 16 bytes LPWSTR a = new WCHAR[8]; // hier mit sizeof(a) ergibt aber nur 4 byteswie ist die tatsächlich gröse beim 2.Fall?
8 * WCHAR = 16 bytes, muss man die größe von der Zeiger dazu zählen?
insgesamt 16 + 4 = 20 bytes? ist das so richtig. wenn das wahr is, heisst es speicher von heap anzufordern hat man immer insgesamt 4 bytes mehr als speicher von stack.
-
nö.
der zeiger (=die variable vom typ LPWSTR) hat (in diesem fall) 4 byte (wobei andere werte genauso möglich sind - je nach plattform). daher sizeof() == 4.der angeforderte speicher ist 16 byte gross (wobei hier wieder ander werte möglich sind - sizeof(wchar_t) muss nicht 2 sein).
was wirklich an speicher verbraucht wird kann man so nicht sagen, das kommt drauf an wie "new" implementiert ist.
im idealsten aller idealfälle sind es 16 byte, eher wahrscheinlich sind 20 oder 24 byte.
sollte dich aber nur aus reiner neugier interessieren - realistisch betrachtet is das alles für > 90% aller programme vollkommen egal.
-
Also auf die Frage hin ob man (ganz allgemein), mehr Speicher verbraucht wenn man Speicher vom Freispeicher anfordert als wenn man das ganze im Stapelspeicher ablegen würde, würde ich mal vermuten ja.
Denn wie du erkannt hast, kommt ja noch die Größe des Zeigers als zusätzlich zu erzeugender Speicher hinzu.
Doch sind Zeiger ja so klein, dass du das getrost ignorrieren kannst.Du musst halt bedenken, dass der Vorteil nicht nur darin liegt den Kram außerhalb von Gültigkeitsbereichen verwenden zu können in denen die Daten erzeugt wurden, sondern auch, dass du nur die Größe des Zeigers rumreichen musst wenn du die Daten irgendwo brauchst.
Also jedes mal nur 4 Bytes kopierst als (z.B.) 30 bytes oder mehr, je nachdem wie groß deine Objekte so werden.
-
danke für die antworten.