2017-09-27 9 views
7

Ich hatte immer angenommen, dass die Größe eines Arrays von N-Elementen des Typs T, wie von sizeof zurückgegeben wurde garantiert, genau N mal sizeof(T) sein.Ist die Größe von (T [N]) == N * sizeof (T) garantiert?

Die comments on this question ließ mich daran zweifeln. Es gibt Ansprüche von seriösen Benutzern, dass Arrays Padding enthalten können, die die Gleichheit brechen würde. Natürlich gibt es solche Plattformen nicht, aber sind sie erlaubt?

Wenn erlaubt, würde dies viele gemeinsamen Idiome brechen, wie etwa den benötigten Speichers für ein Array mit N * sizeof(T) Berechnung, oder die Anzahl der Elemente in einem Array-Berechnungs sizeof(a)/sizeof(a[0]) verwenden.

+0

Da "sizeof" immer mit dem statischen Typ und nicht mit Laufzeitwerten zu tun hat, denke ich nicht, wie sich der tatsächliche Speicher verhält. Ob 'sizeof (T [N]) == N * sizeof (T)' ist ein Typsystem und Vorverarbeitungsaspekt. –

+1

@AsadSaeeduddin - richtig, ich denke nicht, dass ich sonst angedeutet habe? Oder vielleicht war es eine Antwort auf einen jetzt gelöschten Kommentar. – BeeOnRope

+0

Ich habe die Diskussion aus dem Thread kommentiert, mit dem du verlinkt warst. Es kann sehr gut der Fall sein, dass es Laufzeiten gibt, in denen Arrays mehr Platz einnehmen als die Summe ihrer Elementgrößen, aber dies hat keinen Einfluss darauf, dass "sizeof (T [N])" 'N * sizeof (T) ist. '. –

Antwort

2

Der springende Punkt von sizeof ist es enthält die entsprechende Polsterung. Jedes Element eines Arrays ist genau sizeof(T) Bytes nach dem vorherigen Element. Die Größe des gesamten Arrays ist also N * sizeof(T).

+1

Ich denke, die Frage ist, ob 'sizeof (T)' extra Padding * nur für das Array * erlaubt. Alle einzelnen Objekte haben eine Auffüllung, aber erlaubt der Standard, dass das Array selbst über die Auffüllung der Elemente hinaus verfügt? –

+0

Woher kommt diese zusätzliche Polsterung? –

+0

Vom Compiler sagen, dass "sizeof (T [N])> N * sizeof (T)", so dass es am Ende extra Polsterung setzt. Der C++ - Standard sagt nicht viel über das Layout aus, und solange das zusätzliche Padding die Ausrichtungsanforderungen von 'T [N]' beibehielt, die mindestens die von 'T' sein müssten (ich denke, dass dies erforderlich ist) sei genau das gleiche, aber ich bin mir nicht sicher), es wäre erlaubt. –

11

Ja. [expr.sizeof] enthält dieses Bit über sizeof:

Wenn auf eine Anordnung angewendet wird, das Ergebnis ist die Gesamtzahl der Bytes in dem Array ist. Dies bedeutet, dass die Größe eines Arrays von n Elementen n mal die Größe eines Elements ist.

+0

10 Die Sache ist, ich weiß nicht, wo "die Gesamtzahl der Bytes im Array" definiert ist, und ich denke, dass die Aussage "Dies bedeutet ..." falsch ist; Ich denke, dass der Rest des Standards ohne diese Aussage nicht impliziert, dass es am Ende keine unsichtbare Auffüllung gibt. Wenn ich damit recht habe, dann stellt sich die Frage, ob dieser Satz als äquivalent zu "Es ist garantiert, dass die Größe eines Arrays von * n * Elementen * n * mal die Größe eines Elements ist" oder nur ein Problem in Der Standard. –

+0

@DanielH Natürlich ist es wahr, es gibt keine Auffüllung am Ende des Arrays. Es wird nirgendwo im Standard erwähnt, dass ein solches Padding existieren könnte. "Ein Objekt vom Typ Array enthält einen zusammenhängend zugeordneten nicht leeren Satz von N Teilobjekten vom Typ T." Nichts mehr. Nur Klassenarten können Füllbytes enthalten. –

+0

@ n.m. Wenn Sie "natürlich" gehen, werden Sie relativ schnell ein undefiniertes Verhalten bekommen. Jetzt, wo Sie dieses Zitat hervorheben, erinnere ich mich daran, es gesehen zu haben, aber die Leute waren sich nicht sicher, ob es bedeutete, dass es * nur * diese Dinge enthalten musste oder nicht. –

Verwandte Themen