Kann die Reihenfolge der Mitglieder in der binären Architektur von Objekten einer Klasse sich auf die Leistung von Anwendungen auswirken, die diese Klasse verwenden? und ich frage mich, wie man die Reihenfolge der Mitglieder von PODs entscheidet, wenn die Antwort ja ist, da der Programmierer die Reihenfolge der Mitglieder über die Reihenfolge ihrer Erklärungen definierthat die Reihenfolge der Mitglieder von Objekten einer Klasse Auswirkungen auf die Leistung?
Antwort
Absolut. C++ garantiert, dass die Reihenfolge der Objekte im Speicher der Deklarationsreihenfolge entspricht, es sei denn, ein Zugriffsqualifikator greift ein.
Objekte, die direkt benachbart sind, befinden sich wahrscheinlicher auf der gleichen Cache-Line, so dass ein Speicherzugriff beide abruft (oder beide aus dem Cache löscht). Cache-Effektivität kann auch verbessert werden, da der Anteil der Nutzdaten darin höher sein kann. Einfach gesagt, räumliche Lokalität in Ihrem Code übersetzt sich in räumliche Lokalität für die Leistung.
Auch, wie Jerry in den Kommentaren feststellt, kann die Reihenfolge die Höhe der Polsterung beeinflussen. Sortieren Sie die Elemente, indem Sie die Größe verringern, indem Sie die Ausrichtung verringern (behandeln Sie ein Array normalerweise nur als ein Element seines Typs und eine Mitgliedsstruktur als das am meisten ausgerichtete Element). Unnötiges Auffüllen kann die Gesamtgröße der Struktur erhöhen, was zu höherem Speicherverkehr führt.
C++ 03 § 9/12:
nicht statische Datenelemente eines (non-union) Klasse deklariert ohne einen intervenierenden zugriffs Spezifizierer zugeordnet sind, so dass später Mitglieder höhere Adressen innerhalb ein Objekt der Klasse . Die Reihenfolge der Zuweisung von nicht statischen Datenelementen, die durch einen Zugriffs-Spezifizierer getrennt sind, ist nicht spezifiziert (11.1). Implementation Alignment Anforderungen können zwei benachbarten Mitglieder nicht direkt zugewiesen zugeordnet werden; so könnte Anforderungen an Platz für die Verwaltung von virtuellen Funktionen (10.3) und virtuellen Basisklassen (10.1).
Absolut stimmen Sie mit Potatoswatter überein. Es sollte jedoch ein weiterer Punkt bezüglich der CPU-Cache-Zeilen hinzugefügt werden.
Wenn Ihre Anwendung Multithread ist und verschiedene Threads Mitglieder Ihrer Struktur lesen/schreiben, ist es sehr wichtig, dass diese Mitglieder nicht innerhalb derselben Cachezeile sind.
Der Punkt ist, dass, wenn ein Thread eine Speicheradresse ändert, die in anderen CPU zwischengespeichert wird - diese CPU sofort die Cache-Zeile ungültig macht, die diese Adresse enthält. Daher kann die Reihenfolge falscher Mitglieder zur ungerechtfertigten Cache-Invalidierung und Leistungsverschlechterung führen.
Neben der Laufzeitleistung, in den Cache-Zeile bezogenen Antworten beschrieben, ich glaube, man auch Gedächtnisleistung, das heißt die Größe des Klassenobjekts in Betracht ziehen sollten.
Aufgrund der padding hängt die Größe des Klassenobjekts von der Reihenfolge der Membervariablendeklaration ab.
Die nachfolgende Erklärung wahrscheinlich 12 Bytes
class foo {
char c1;
int i;
char c2;
}
Jedoch nehmen würde, auf einfache Neuanordnung der Reihenfolge der Elementdeklaration wahrscheinlich die folgenden, würde 8 Bytes
class bar {
int i;
char c1;
char c2;
}
In Maschinen nehmen ausgerichtet mit 4-Byte-Wörtern:
sizeof(foo) = 12
aber
sizeof(bar) = 8
- 1. Hat eine große Klasse Auswirkungen auf die Leistung?
- 2. Warum hat die Änderung der Reihenfolge dieser Anweisungen erhebliche Auswirkungen auf die Leistung?
- 3. Hat das Hinzufügen von [Serializable] zur Klasse irgendwelche Auswirkungen auf die Leistung?
- 4. Log.d und Auswirkungen auf die Leistung
- 5. Auswirkungen auf die Leistung mit ASP.NET-Steuerelementen
- 6. Spark - Checkpointing Auswirkungen auf die Leistung
- 7. App Engine TaskQueue-Task, die Auswirkungen auf die Leistung von Benutzern mit Handlern hat
- 8. Hat die Reihenfolge der Exploration in DFS Auswirkungen auf die Kantenklassifizierung
- 9. Hat die Argumentreihenfolge für die C-Aufrufkonvention jemals Auswirkungen auf die Leistung?
- 10. Auswirkungen auf die Leistung von ORDER BY COALESCE in MySQL
- 11. Auswirkungen auf die Leistung von columnfamily und Version in Hbase
- 12. „Auswirkungen auf die Leistung“ bei der Verwendung war ein 20K Linien einzelne Klasse
- 13. Das Ändern von AppSetting hat keine Auswirkungen auf die Anwendung
- 14. Hat die deklarierte Größe eines Varchar-Feldes Auswirkungen auf PostgreSQL?
- 15. Hat die Implementierungsdefinition von char Auswirkungen auf std :: string?
- 16. Hat die Reihenfolge der Importanweisungen eine Auswirkung?
- 17. Leistung Auswirkungen von RDD auf JavaRDD Konvertierung
- 18. Leistung Auswirkungen der Verwendung von Swashbuckle
- 19. Die Verwendung von LoadLevel hat Auswirkungen auf Licht
- 20. Cassandra Primärschlüssel. Auswirkungen auf die Leistung, wenn Ganzzahl vs Varchar
- 21. Beeinflusst die Größe einer JAR-Datei die Leistung der JVM?
- 22. Hat die Reihenfolge der Attribute irgendwelche Garantien?
- 23. Hat die Verkettung von jQuery-Selektoren irgendwelche negativen Auswirkungen?
- 24. Wie Sie die störende Intellisense-Notiz in einer Klasse deaktivieren, die Mitglieder mit CLIEvent-Attributen hat?
- 25. Varnish: Leistung Auswirkungen große Ban Liste
- 26. Die Auswirkungen von virtuellen auf die Verwendung von Mitglied der Klasse Vorlage
- 27. Statische Mitglieder einer Klasse
- 28. Warum erbt die abgeleitete Klasse die privaten Mitglieder der Basisklasse?
- 29. Hat die Änderung der Systemzeit nachteilige Auswirkungen SQL Server
- 30. Was ist ein CTE-Scan und welche Auswirkungen hat er auf die Leistung?
Wow, ich habe es nicht bemerkt, aber ich habe diese Antwort 112 * Sekunden * nach der Frage gepostet! – Potatoswatter
@Potatoswatter_cool Leistung !!! – Pooria
Auch seine Größe könnte von Bedeutung sein. Da der x86-Prozessor (und wahrscheinlich viele andere) spezielle Opcodes für den Speicherzugriff mit Indexregister hat, wird auf ein Array von Objekten mit einer Größe von 1, 2, 4 oder 8 Bytes schneller zugegriffen. – ruslik