0
votes

Comment créer une structure en C # qui contient un tableau mais n'utilise pas de tas?

Qu'est-ce dont j'ai besoin:

  • un polygone avec une quantité arbitraire de sommets (ou au moins jusqu'à max nombre de sommets)
  • Il devrait être une structure, de sorte qu'elle puisse être rapide et peut être attribuée / passée par la valeur

    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: xxx

    puis comment créer une structure pouvant avoir un nombre arbitraire (ou un nombre fixe) de sommets, mais sans utiliser de tas du tout?

    Je pourrais simplement utiliser de nombreuses variables comme v1, v2, v3 ... v10 etc., mais je veux garder mon code propre, plus ou moins.


5 commentaires

Votre préoccupation est-elle réelle concernant Stack vs. heap ou type de référence par rapport à la valeur ? 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.


3 Réponses :


0
votes

S'il convient à votre logique, vous pouvez utiliser un span , qui est attribué sur la pile. En savoir plus ici < / p>


0 commentaires

0
votes

Une autre façon de simplement copier le tableau avec un constructeur de copie xxx

puis xxx


0 commentaires

1
votes

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> xxx pré>

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`
     }
 }


4 commentaires

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 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 () 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; } Les données peuvent résident sur le tas. Cela a du sens depuis le point de struct consiste à conserver toutes les données ensemble.