Qu'est-ce dont j'ai besoin:
max code> nombre de sommets) li>
- Il devrait être une structure, de sorte qu'elle puisse être rapide et peut être attribuée / passée par la valeur li>
ul>
On dirait que je ne peux pas utiliser de tableaux ni de collections pour stocker des sommets, car mon groupe de polygones pointerait des objets sur un tas, et lorsque un polygone est attribué à un autre par valeur, la seule copie peu profonde serait être effectué et j'aurais les deux polygones pointant vers la même matrice de sommet. Par exemple: p> xxx pré> puis comment créer une structure pouvant avoir un nombre arbitraire (ou un nombre fixe) de sommets, mais sans utiliser de tas du tout? P>
Je pourrais simplement utiliser de nombreuses variables comme v1, v2, v3 ... v10 code> etc., mais je veux garder mon code propre, plus ou moins. p> p> p>
3 Réponses :
S'il convient à votre logique, vous pouvez utiliser un span
Une autre façon de simplement copier le tableau avec un constructeur de copie puis p>
Vous avez la possibilité de définir votre tableau avec le mot-clé code> fixe code>, qui la met dans la pile.
Mais vous ne pouvez pas accéder directement aux éléments du tableau, sauf si vous n'êtes dans un dangereux code> contexte et utilisez des pointeurs. p>
Pour obtenir le comportement suivant: p> puis utilisez la définition de classe suivante: p > unsafe struct FixedArray
{
fixed int vertices[100];
int size;
Foo(int size)
{
this.size = size;
// no initialization needed for `vertices`
}
}
La fixation d'un objet ne le déplace pas à la pile, et il ne se comporte pas non se comporter comme un type de valeur. Cela garantit simplement que le GC ne le déplace pas pendant ses collections.
@Servy non pas, fixe code> dans les structures est un mot clé spécial qui déplace les valeurs de la pile. J'ai simplifié l'exemple et supprimé les énoncés
fixe () code> et cela fonctionne toujours. Cela a été une amélioration depuis L'introduction initiale . Essayez-le et vous verrez cela exactement comme demandé.
Si je comprends bien, le mot-clé'Fixed'' a intégré la matrice de taille fixe dans le cadre de la structure. Que le tableau vit sur la pile ou le tas dépend de la manière dont la structure est utilisée. S'il est utilisé comme déclaration de variable locale, les données vivront en effet sur la pile, mais si elle est utilisée en tant que membre d'une classe de référence, la mémoire tampon vivra sur le tas (avec une instance de l'encrassement de la classe. tout le tableau de taille fixe dans le cadre de ses champs et non comme une référence à un tableau indépendant)
Donc, avec une déclaration de la classe FOO {FixeTarray Data; } code> Les données peuvent résident sur le tas. Cela a du sens depuis le point de
struct code> consiste à conserver toutes les données ensemble.
Votre préoccupation est-elle réelle concernant
Stack vs. heap code> ou
type de référence par rapport à la valeur code>? Si l'ancien, consultez Stackalloc .
Avoir un polygone potentiellement grand entièrement dans la mémoire de pile et le transmettre (copiez-le à chaque fois que vous le transmettez comme paramètre de fonction, etc.) n'est pas nécessairement plus rapide (et éventuellement plus lent) que d'utiliser une collection standard. Avez-vous des problèmes réels que vous devez corriger ou essayez-vous d'optimiser de manière préemptive un problème qui pourrait n'exister peut-être même pas?
Je pense que dans ce cas, votre question est davantage sur la copie approfondie d'une liste qu'à propos de Stack vs. Heap. La pile et le tas sont des détails de la mise en œuvre que nous n'avons pas besoin de vous inquiéter d'environ 99% du temps.
Aussi, voir: Collection .NET qui est une structure et copie de la liste
Avec respect, vous pourriez avoir de meilleures réponses si vous expliquez ce que vous voulez faire. Votre question est de savoir comment le faire. S'il vous plaît Modifier Votre question. Et gardez à l'esprit que le C # / Roslyn Compiler Tech fait un excellent travail d'optimisation du code et de la manipulation des structures de données. Si vous avez besoin de le déjouer, vous savez probablement exactement ce que cela vous trompe, et vous devriez nous dire.Premature Optimisation peut rendre le code complètement immuable.