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++

  1. #1
    Membre éprouvé
    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
    Points : 1 066
    Points
    1 066
    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 chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    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 .
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre éprouvé
    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
    Points : 1 066
    Points
    1 066
    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
    Points : 4 625
    Points
    4 625
    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.
    Boost ftw

  5. #5
    Membre éprouvé
    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
    Points : 1 066
    Points
    1 066
    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 : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    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)

  7. #7
    Membre éprouvé
    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
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    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.
    Je m'en rends bien compte, je ne suis ni idiot ni total débutant... Mais comme tu joues sur les mots, je vais être plus précis: "je cherche un moyen d'allouer une bonne fois pour toute un bloc de mémoire, pour qu'il puisse contenir par après d'autres objets sans devoir réallouer de la mémoire en permanence." Ca te va ça ?

    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.
    Relis mieux: "dans une adresse que je choisis dans mon bloc." Ca implique donc bien que j'ai choisi une adresse relative au début de mon bloc.

  8. #8
    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 : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par Antoine_935 Voir le message
    Je m'en rends bien compte, je ne suis ni idiot ni total débutant... Mais comme tu joues sur les mots, je vais être plus précis: "je cherche un moyen d'allouer une bonne fois pour toute un bloc de mémoire, pour qu'il puisse contenir par après d'autres objets sans devoir réallouer de la mémoire en permanence." Ca te va ça ?
    Voui et là c'est bien le placement new qu'il faut utiliser. Mais l'intêret m'échape quand même un peu.

    Citation Envoyé par Antoine_935 Voir le message
    Relis mieux: "dans une adresse que je choisis dans mon bloc." Ca implique donc bien que j'ai choisi une adresse relative au début de mon bloc.
    Et là que je me rends compte que ta phrase n'a pas de sens (ou alors je suis très fatigué et je ne pige plus rien, ce qui est fort possible ).
    Un adresse, c'est un nombre qui à une correspondance dans le RAM. Cette correspondance se fait grâce à l'OS, je ne vois pas ce que viens faire la notion de bloc la dedans.

    PS/ regarder du coté des allocateurs qui allouent par bloc de N objets contiguës en mémoire, ca peut t'intérésser.
    "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)

  9. #9
    Membre éprouvé
    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
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Voui et là c'est bien le placement new qu'il faut utiliser. Mais l'intêret m'échape quand même un peu.
    Wikipedia donne un bref aperçu des avantages des pool (j'ai enfin trouvé le nom que ça avait)
    http://en.wikipedia.org/wiki/Memory_pool

    Un adresse, c'est un nombre qui à une correspondance dans le RAM. Cette correspondance se fait grâce à l'OS, je ne vois pas ce que viens faire la notion de bloc la dedans.
    Quand tu alloues un tableau de... mettons char tiens, mais char dans le sens byte, et non caractère.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char* str = malloc(20);
    // str est une adresse, logique :p
    (str + 1) // une autre adresse tout aussi valide
    Maitenant considérons que mes blocs font 4 bytes, pour reprendre le code du dessus, j'aurai 5 blocs, qui auront chacun leur adresse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char* str = malloc(20)
    char* bloc0 = str;
    char* bloc1 = str + 4;
    char* bloc2 = str + 8;
    char* bloc3 = str + 12;
    char* bloc4 = str + 16;
    Et je me retrouve avec 5 adresses issues d'une seule allocation. Allocation qui a été coupée en 5 blocs.

  10. #10
    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 : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par Antoine_935 Voir le message
    SNIP ALL
    Oui, je suis bien d'accors avec ca, mais fait main, ca tient plus de l'obfuscation que d'autre chose. Après, si c'est intègré dans un allocateur, là, ca devient très intéréssant (comme dans boost::pool)
    "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)

  11. #11
    Membre éprouvé
    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
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Après, si c'est intègré dans un allocatoteur, la devient très intéréssant (comme dans boost::pool)
    Mais c'est bien le but voyons Relis l'extrait de code que j'ai mis plus haut, tu le verras de suite.

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Antoine_935 Voir le message
    Mais c'est bien le but voyons Relis l'extrait de code que j'ai mis plus haut, tu le verras de suite.
    Tout à fait, mais, il me semble que Davidbrcz (il le confirmera sans doute) voulait dire que, outre l'allocation dynamique il reste de nombreuses choses à gérer une fois que tu es arrivé à ce point...

    Cela va du "placement new" lorsque tu décide d'utiliser un bloc particulier du pool à... la gestion de la disponibilité des blocs.

    Sauf erreur, boost::pool permet de te faciliter la vie en ayant une vision "globale" du problème, et en "automatisant" plus ou moins cette gestion
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Membre éprouvé
    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
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par koala01 Voir le message
    il reste de nombreuses choses à gérer une fois que tu es arrivé à ce point...
    Oui, et je me suis vite rendu compte que c'était plus compliqué que prévu de faire quelque chose d'efficace.

    Je me suis balladé çà et là sur le ent pour trouver des infos là dessus, et le système de boost me parait un des mieux adaptés, pourvu qu'on connaisse la taille des objets qui seront stockés. Ca tombe bien, c'est le cas

+ 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