8
votes

Objets de longueur variable: une bonne idée?

Mon application utilise une grande quantité de panda code> objets. Chaque panda code> a une liste des objets code> bambou code>. Cette liste ne change pas une fois que le panda code> est initialisé (no bambou code> est ajouté ou supprimé). Actuellement, ma classe est mise en œuvre comme suit:

class Panda
{
    int a;
    int b;

    Panda ()
    {
        // ... other initializations here ...
    }

    static Panda *createPanda (int count, Bamboo* bamboo)
    {
        byte* p = new byte[sizeof(Panda) +
                           sizeof(Bamboo) * count];
        new (p) Panda ();

        Bamboo* bamboo = (Bamboo*)
            p + sizeof(Panda);

        // ... copy bamboo objects into the memory
        // behind the object...

        return (Panda*)p; 
    }
}


5 commentaires

Ça va mordre. Et ça va mordre dur.


Vous rompez la majeure partie de la sémantique des types de classe en C ++. Les objets de longueur variable n'existent pas en C ++.


Si vous êtes intéressé par des hacks d'arrosage oculaire de cette nature, vous souhaitez également consulter les modèles de classe TBUF8 et TBUF16 de Symbian / C ++.


"... Pour atténuer les frais généraux d'allouer un tableau de bambou objets ..." d'abord aller et mesurer si cela vaut la peine d'être fait. Lorsque vous avez trouvé des chiffres difficiles montrant un besoin, revenir et demander quoi faire pour améliorer une conception simple pour être plus rapide. Peut-être que ce qui précède est une bonne solution au problème (jusqu'à présent, pas existant). Imo c'est probablement pas.


Probablement sur ce point, mais le casting de p à bambou * se produit avant l'addition de Tailleof (panda) , donc votre Bambou Will (mange) des dépassements (et des feuilles), le panda par un facteur de la taille d'un pointeur (c'est-à-dire 4 à 8 fois).


7 Réponses :


1
votes

Vous utilisez "Nouveau" look de nouvel opérateur. C'est complètement correct panda relatif, mais pourquoi n'utilisez-vous pas initialisateur de bambou?


0 commentaires

5
votes

Vous serez mordu si quelqu'un prend un panda par rapport à la valeur, par exemple

//compiler allocates 16-bytes on the stack for this local variable
Panda panda = *createPanda(15, bamboo);


0 commentaires

3
votes

Sur la base de mon expérience, l'optimisation prématurée est la plus toujours "prématurée". C'est-à-dire que vous devriez indiquer votre code et déterminer s'il est nécessaire d'optimiser ou que vous créez plus de travail pour vous-même dans la longue courir.

En outre, il me semble que les questions quant à savoir si l'optimisation en vaut la peine ou non dépend beaucoup de la taille de la classe de bambou et du nombre moyen d'objets de bambou par panda.


0 commentaires

11
votes

C ++ vous donne une autre option. Vous devriez envisager d'utiliser STD :: Vector. XXX

Si vous souhaitez stocker PANDA et Bamboos en mémoire continue, vous pouvez utiliser une solution à partir de cet article . L'idée principale est de surcharger opérateur Nouveau et Supprimer .


3 commentaires

Vous devez être conscient des effets secondaires de ce type de solutions et des problèmes que vous devrez faire face: les utilisateurs ne pourront pas utiliser les objets à l'intérieur des conteneurs (notamment STD :: Vecteur de la mémoire préallocate basée sur la taille de la taille du Type est passé) Ce trucery se poursuivra avec le code qui n'est pas seulement difficile à maintenir (le questionneur sait) mais non naturel à utiliser


Le plus naturel est d'utiliser std :: vecteur . Toutes les autres solutions ont une utilisation très limitée et doivent être appliquées avec prudence.


Si je ne me trompe pas, la mise en œuvre de la chaîne de GCC utilise ce type de scandale. L'astuce est que l'objet Panda pourrait contenir un seul pointeur à la classe de mise en œuvre (globale).



3
votes

Ceci a été trouvé dans C.
Mais en C ++, il n'y a pas de besoin réel.

La vraie question est pourquoi voulez-vous faire cela?

C'est une optimisation prématurée, utilisez simplement un std :: vecteur <> interne et tous vos problèmes disparaîtront.

Parce que vous utilisez un pointeur brut en interne que la classe possède vous aurait besoin de remplacer les versions par défaut de:

  • Constructeur par défaut
  • destructeur
  • Copie Constructor
  • Opérateur d'affectation

0 commentaires

7
votes

Comment convaincre les gens que dans la programmation de la simplicité et de la clarté - à court: quels mathématiciens appellent «élégance» - ne sont pas un luxe dispensable, mais une matière cruciale qui décide entre le succès et l'échec?

- Edsger W. Dijkstra


2 commentaires

Juste pas. Beaucoup de choses peuvent aller mal ... Comment allez-vous implémenter des constructeurs de copies, des missions, des destructeurs? Comment allez-vous faire face aux utilisateurs qui souhaitent avoir des tableaux de Panda?


Les mathématiciens n'ont aucune idée de la programmation et du monde réel.



3
votes

Si vous êtes désespéré, vous pouvez probablement faire quelque chose comme ceci: XXX

Mais je pense que vous n'êtes pas désespéré, mais vous optimisez prématurément.


0 commentaires