IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Gros objets sur la stack et modification de new ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut Gros objets sur la stack et modification de new ?
    Salut à tous, c'est encore moi

    Question du jour: peut-on mettre des gros objets sur la stack, ou est-ce préférable de les mettre dans le heap ?
    Comprenez bien, je parle d'objets d'une vingtaine de Mo

    Edit: et en question parallèle, si je devais mettre cet objet dans le scope global... bonne ou mauvaise idée ?

    Edit2: puisque c'est là que je veux en venir, autant vous en parler aussi...
    Le but de cette opération est de créer des gros blocs de mémoire d'un coup, pour ensuite allouer dedans des espaces mémoire pour des objets.
    C'est peut-être une très mauvaise idée, mais ce n'est pas vraiment le point de ma question ici (même si les commentaires sont les bienvenus).
    Ce que je cherche mnt, c'est comment forcer la construction d'un objet dans une adresse que je choisis dans mon bloc.

    En gros, comment pourrais-je faire pour créer dans la classe MemoryBlock une méthode qui va trouver un espace mémoire dispo dans elle même, et y construire un objet ? Le problème n'est pas de trouver un espace mémoire bien sur, mais bien de créer l'objet où je le décide. J'ai pensé à deux trois trucs, et le premier me semble la plus belle solution à l'usage, mais est-ce possible ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Object* myObj = new(memblock) Object();
    Object* myObj = memblock->new<Object>();
    Object* myObj = memblock->new(Object); // Je trouve cette dernière particulièrement moche...

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Si tu veux choisir où placer ton objet fait un placement new.

    Pour les 20mo (un objet de 20mo j'ai un doute :/) sur la pile tu vas la faire exploser vingt fois xD. Pour ordre d'idée sous un systéme unix la pile est de 8 mo il me semble et sous windows 1mo. Donc bon .

  3. #3
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Citation Envoyé par Goten Voir le message
    Si tu veux choisir où placer ton objet fait un placement new.
    Ce n'est pas ce que je veux justement, je veux controler l'endroit où c'est alloué. Mais j'ai trouvé (je ne controle rien ici, évidemment... mais on se comprend )
    cfr. http://www.bearcave.com/software/c++_mem.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <iostream>
    using namespace std;
     
    #include <stdlib.h>
     
    class MemoryBlock {
    public:
    	void* alloc(unsigned int size) {
    		void* addr = malloc(size);
    		cout << "Allocated " << addr << endl;
    		return addr;
    	}
    };
     
     
    class Simple {
    	int value;
    public:
    	Simple() {
    		cout << "Simple construct" << endl;
    		cout << this << endl;
    		value = 5;
    	}
     
    	void print() {
    		cout << value << endl;
    	}
    };
     
    // Care IBM
    void* operator new(unsigned int size, MemoryBlock* mem) {
    	return mem->alloc(size);
    }
     
    int main() {
    	MemoryBlock mem;
     
    	Simple* s = new(&mem) Simple();
     
    	return 0;
    }
    Pour les 20mo (un objet de 20mo j'ai un doute :/) sur la pile tu vas la faire exploser vingt fois xD. Pour ordre d'idée sous un systéme unix la pile est de 8 mo il me semble et sous windows 1mo. Donc bon .
    lol, j'ai bien fait de demander donc :p Merci pour l'info

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    je veux controler l'endroit où c'est alloué
    Tu ne peux pas faire ça en C++ standard.

    Après sous Unix tu peux faire un mmap pour ça.

  5. #5
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Tu ne peux pas faire ça en C++ standard.
    Pourtant le code que j'ai mis juste au dessus le fait... Il n'y a qu'a allouer un espace mémoire à la création de mon object MemoryBlock au dessus, et à retourner un pointeur dans cet espace alloué.

    Enfin... il n'y a qu'a... facile à dire la gestion de la mémoire disponible est une horreur.

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Pourtant le code que j'ai mis juste au dessus le fait... Il n'y a qu'a allouer un espace mémoire à la création de mon object MemoryBlock au dessus, et à retourner un pointeur dans cet espace alloué.
    Non tu confonds.

    Avec le code au dessus, tu places ton ton objet dans un endroit qui va changer d'une execution du programme à l'autre car il y a appel à malloc, qui passe la main à l'OS pour avoir de la mémoire. Ce n'est pas toi qui fixe l'adress de l'objet, c'est l'OS. Au mieux tu peux forcer un objet à avoir une adresse précise, mais tu n'as pas le choix de l'adresse.

    Ta première phrase ("Ce que je cherche mnt, c'est comment forcer la construction d'un objet dans une adresse que je choisis dans mon bloc.") implique que l'adresse est choisie par le programme(ur) ce qui n'est possible qu'avec mmap sous les sytème Unix-like.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/08/2006, 16h24
  2. Réponses: 5
    Dernier message: 31/10/2005, 11h58
  3. Réponses: 6
    Dernier message: 09/05/2004, 13h18
  4. [VB.NET] Instanciation objet (sur class perso.)
    Par DaxTaz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/05/2004, 11h07
  5. Créer des objets sur la pile ?
    Par Cornell dans le forum Langage
    Réponses: 8
    Dernier message: 03/03/2003, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo