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 :

[C# debutant ] zone memoire toujours valide ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut [C# debutant ] zone memoire toujours valide ?
    bonsoir , je commence mon apprentissage du C# ( je vien du milieu C et C++ ) et donc j'experimente les pointeurs en C# .

    j'aimerais savoir si ce code est correcte ( au niveau fonctionnement du programme parceque syntaxiquement il est juste ) , sur mon bouquin ils disent que que la memoire est libere juste apres la fin de la fonction , et je voudrais en etre sur ( enfin le gc la libere quand il veut mais vous m'avez compris ).

    le programme marche normalement mais sa ne m'inspire pas confiance vu que sa peut etre un coup de chance des pointeurs .


    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    using co = System.Console;
    namespace testsCs
    {
     
        class Program
        {
     
            unsafe static int* f()
            {
                int* k = stackalloc int[100000];
                return k;
            }
     
     
            unsafe static int Main(string[] args)
            {
                int* p = f();
     
                for (int i = 0; i < 100000; i++)
                    p[i] = i;
     
                co.Write("\n");
                return 0;
            }
        }
    }
    Merci pour vos reponses et ne soyez pas avare niveau explication je suis la pour apprendre

  2. #2
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Oublie les pointeurs en C# !!

    C'est une erreur classique quand on vient du C, si on a pris gout a jouer avec des pointeurs en C, on s'empresse en C# d'essayer de reproduire la meme chose

    Or conceptuellement il n'y a pas de pointeurs explicite en C#
    Mais pratiquement tous les objets que tu instancie sont gérés par référence

    Les seules fois ou j'ai du manipuler des pointeurs de maniere explicite c'est pour dialoguer avec une DLL ecrite en C qui elle utilise des pointeurs conventionnels C

  3. #3
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    Merci pour la reponse , et c'est ce qui disent dans mon bouquin , maintenant j'aimerais juste explorer de fond en comble le language C# pour voir ce qu'il a a offrir et ses possibilités , je ne peux pas ne pas fermer les yeux sur la theorie parceque apres sa va me penaliser .

    je redonne ma question , est ce que mon code est valide en C# (parceque en C/C++ il l'est ) ou bien le GC fait le nottoyage juste apres ?

  4. #4
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    J'ai des doutes

    StackAlloc alloue sur le stack dans l'environement d'une methode
    Or le stack a des fortes chances d'etre bouleversé au retour de la methode

    Mes connaissances actuelles internes de la mecanique C# s'arretent ici pour le moment

    Ton souci de connaissance du détail (et c'est rare) t'honorent mais franchement ce genre de pratique est tout a fait inutile et obsolete en C# il y a beaucoup d'autres choses qui vallent beaucoup plus la peine d'etre découverte
    Bone chance

  5. #5
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par olibara Voir le message
    stackalloc alloue sur le stack dans l'environement d'une méthode. Or le stack a des fortes chances d'etre bouleversé au retour de la me méthode thode
    C'est tout à fait ça, puisque si on prend la documentation du mot clé stackalloc sur la MSDN
    Citation Envoyé par MSDN
    La durée de vie du bloc de mémoire est limitée à la durée de vie de la méthode qui le définit. Vous ne pouvez pas libérer la mémoire avant le retour de la méthode.
    C'est donc juste pour un usage local. D'ailleurs la MSDN insiste en indiquant que "stackalloc est valide seulement dans les initialiseurs de variable locale". Ton exemple est donc fonctionnel mais faux compte tenu de ceci.

    A moins que tu ne travailles par exemple dans le traitement d'image par, où l'utilisation de code non managé est plus performant, il n'y a pas d'intérêt à t'appesantir plus que ça sur ce sujet.

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par StormimOn
    A moins que tu ne travailles par exemple dans le traitement d'image par, où l'utilisation de code non managé est plus performant, il n'y a pas d'intérêt à t'appesantir plus que ça sur ce sujet.
    Et ca reste relatif !
    J'ai travaillé longtemps en C a couper des bit en quatres par souci de performance et franchement j'ai rarement eté décu par les performance de C# meme pour certains traitement un peu tendu

    Et si vraiment il faut gagner sur des traitements intensif genre image ou O(n2) tu a les compétences d'ecrire une dll C qui sera appellée en C# (j'utilise cette methode pour des parcours de graph ou les données sont compactée en bitwise)

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

Discussions similaires

  1. la zone memoire d'un processus : debut fin
    Par ilimo dans le forum Threads & Processus
    Réponses: 13
    Dernier message: 27/06/2007, 07h52
  2. Representation hexadecimal d'une zone memoire.
    Par etranger dans le forum C++
    Réponses: 6
    Dernier message: 13/03/2007, 14h26
  3. Confirm toujours validé
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/05/2006, 17h54
  4. [INSTALL] OUI-10133 : Zone intermédiaire non valide
    Par wlued dans le forum Installation
    Réponses: 6
    Dernier message: 29/12/2005, 11h06
  5. Rendre une zone memoire accessible a un autre processus
    Par Jack_serious dans le forum POSIX
    Réponses: 12
    Dernier message: 07/12/2005, 21h23

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