Es ist nur eine Leistungsregel der Daumen.
Der Punkt ist, dass, weil Werttypen von Wert übergeben werden, die gesamte Größe der Struktur kopiert werden muss, wenn es an eine Funktion übergeben wird, während für einen Referenztyp nur die Referenz (4 Byte) sein muss kopiert. Eine Struktur kann jedoch ein wenig Zeit sparen, da Sie eine Indirektionsebene entfernen. Selbst wenn sie größer als diese 4 Byte ist, ist sie möglicherweise effizienter als eine Referenz zu übergeben. Aber irgendwann wird es so groß, dass die Kopierkosten spürbar werden. Und eine allgemeine Faustregel ist, dass dies typischerweise um 16 Bytes geschieht. 16 ist gewählt, weil es eine schöne runde Zahl ist, eine Potenz von zwei, und die Alternativen sind entweder 8 (was zu klein ist und Strukturen fast nutzlos machen würde) oder 32 (zu diesem Zeitpunkt sind die Kosten für das Kopieren der Struktur bereits problematisch Wenn Sie aus Gründen der Leistung Strukturen verwenden)
Aber letztlich ist dies eine Leistungsempfehlung. Es beantwortet die Frage "Welches wäre am effizientesten zu verwenden? Eine Struktur oder eine Klasse?". Aber es beantwortet nicht die Frage, "welche Karte am besten zu meiner Problemdomäne passt".
Strukturen und Klassen verhalten sich unterschiedlich. Wenn Sie das Verhalten einer Struktur benötigen, würde ich sagen, dass Sie es zu einer Struktur machen, unabhängig von der Größe. Zumindest bis Sie Leistungsprobleme haben, profilieren Sie Ihren Code und stellen Sie fest, dass Ihre Struktur ein Problem darstellt.
Ihr Link sagt auch, dass es nur eine Frage der Leistung ist:
Wenn ein oder mehr diese Bedingungen nicht erfüllt, erstellen Sie einen Referenztyp statt eine Struktur. Fehler bei Einhaltung dieser Richtlinie kann die Leistung negativ beeinflussen.
Ja, der Link sagt, es ist eine Frage der Leistung, aber ist auch ziemlich stark in der Sprache, die es verwendet, d. H. "Definieren Sie keine Struktur ...". Sie hätten sagen können: "Es ist nicht ratsam ..." – Joe
Stimmt, die Formulierung scheint ein bisschen stark zu sein. Aber es könnte sein, zu betonen, dass Heap-allokierte Klassen nicht langsam sind (wie Programmierer aus C/C++ erwarten könnten) – jalf
Eine mögliche Antwort für die genaue Anzahl ist, dass eine 16-Byte-Struktur immer noch klein genug ist, um auf die CPUs zu passen Speicherbus, oder als Teil eines SIMD-Befehls kopiert werden. Größere Strukturen werden komplexer zum Kopieren oder Lesen/Schreiben. – jalf