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 :

Petite aide à la sérialisation


Sujet :

C++

  1. #41
    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
    Citation Envoyé par camboui Voir le message
    Il ne semble pas, C'EST une petite brique. Non pas d'un projet précis, mais d'une réflexion ludique et conceptuelle.

    Je comprend maintenant les réactions du forum: elles sont économiques ou productives alors que j'ai une approche bien plus détachée.

    C'est sur que les réponses dépendent fortement du contexte d'utilisation au final. Sur ce forum je suis toujours en mode : quelqu'un vient chercher une solution pour un problème de code de production, donc oui en général les réponses apportée sont tournée vers la productivité, et la sécurité.
    Si maintenant c'est juste pour le plaisir de se triturer les méninges allons y gaiement.
    Ps : avec le premier code je voyais toujours où tu voulais en venir puisque tu n'adressais pas les problème de boutisme .
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  2. #42
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    À ma connaissance, oui: Sur une machine little-endian, ça inverse, et sur une machine big-endian, l'ordre est conservé.
    Mais je me doute que ça doit être lent, car je vois mal un compilo optimiser ça.
    l'inconvénient c'est le passage par la mémoire qui va faire une pénalité systématique, mais sinon c'est assez malin

  3. #43
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Une version en "méta assembleur" (pour peu que je me souvienne de l'asm x86)
    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
    inline unsigned endianing(unsigned u)
    {
    	_asm
    	{
    		mov eax,[u]
    		mov dl,al
    		shl edx,8
    		shr eax,8
    		mov dl,al
    		shl edx,8
    		shr eax,8
    		mov dl,al
    		shl edx,8
    		shr eax,8
    		mov dl,al
    		mov eax,edx
    	}
    }
    EDIT: je viens d'essayer et ça à l'air bon

    EDIT 2: encore plus compact
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    inline unsigned endianing_x86(unsigned u)
    {
    	_asm
    	{
    		mov edx,[u]
    		mov ah,dl
    		mov al,dh
    		shl eax,16
    		shr edx,16
    		mov ah,dl
    		mov al,dh
    	}
    }

  4. #44
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Beurk... Quitte à taper dans l'ASM, pitié, utilisez les bonnes instructions !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    inline unsigned int SWAP32 ( unsigned int data ) {
      _asm {
        mov eax,[data]
        bswap eax
      }
    }
    L'instruction ASM BSWAP effectue un changement d'endianness sur un registre 32 bits. Disponible à partir du 486.

    EDIT : Version 16 bits.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    inline unsigned short int SWAP16 ( unsigned short int data ) {
      _asm {
        mov ax,[data]
        xchg al,ah
      }
    }
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #45
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Ben fallait l'savoir. Je me suis arrêté à l'époque des 286. Après je sais juste que les registres ax, bx, etc, était devenus eax, ebx, etc, en 32bits.
    Et en 64bits on les appellent comment, eeax, eebx, etc ?

    Au fait, quelqu'un connait une bonne référence asm x86/x64 ? (mmx, sse, etc, tout compris)

    Sinon, voici le code généré inline my_htonl() de médinoc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mov         edx,ebx 
    shr         edx,18h 
    mov         eax,ebx 
    mov         ecx,ebx 
    shr         ecx,8 
    shr         eax,10h 
    mov         byte ptr [esp+16h],cl
    mov         byte ptr [esp+14h],dl
    mov         byte ptr [esp+15h],al
    mov         byte ptr [esp+17h],bl
    ebx contient le paramètre unsigned long. C'est pas si mal optimisé je trouve.

  6. #46
    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
    Ouai, pcasm:

    http://www.drpaulcarter.com/pcasm/#exampleCode

    (c'est assez incontournable amha)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  7. #47
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Super, merci

    Je viens de jeter un oeil rapide, dommage il ne parle que du 32 bits, et encore sans mmx ni sse etc.

    J'ai regardé le code assembleur de la fonction ntohl(). Elle n'utilise pas bswap est elle ne semble pas non plus être "intrisic" (genre inline). Microsoft compilerait-il ses OS pour être encore compatible sur 386 ?

  8. #48
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par camboui Voir le message
    J'ai regardé le code assembleur de la fonction ntohl(). Elle n'utilise pas bswap est elle ne semble pas non plus être "intrisic" (genre inline). Microsoft compilerait-il ses OS pour être encore compatible sur 386 ?
    En général, oui. Le support des instructions au delà du 386 est en général cantonné au noyau, ou à quelques fonctions (souvent intrinsèques) utilisant spécifiquement ces nouvelles instructions / possibilités.

    Sur Visual, par défaut, les instructions SSE sont désactivées : il faut mettre "Oui" dans l'onglet "C/C++" => "Génération de code" => "Activation du jeu d'instructions amélioré".
    Une autre possibilité est d'utiliser les bibliothèques et le compilateur Intel.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #49
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Tiens, je viens de trouver les fonctions intrinsèques correspondantes (et utilisant bswap et consort) : _byteswap_*

    Pour le côté non-optimisé de ntoh*, je pense qu'une des raisons doit être la portabilité du code entre Windows "normal" (toutes versions) et Windows CE. En effet, ce dernier peut être exécuté sur des machines non-x86, ne disposant donc pas de cette instruction...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. petite aide sur une requete INSERT INTO
    Par bonneti dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2005, 15h17
  2. petite aide sur les transactions et triggers SVP
    Par CharleLéo dans le forum Débuter
    Réponses: 4
    Dernier message: 15/11/2004, 20h43
  3. Petite aide pour gros problème : libstdc++
    Par Info-Rital dans le forum Linux
    Réponses: 5
    Dernier message: 30/08/2004, 19h17
  4. Petite aide sur les triggers ?
    Par krimson dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/04/2004, 16h28
  5. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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