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

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2023
    Messages
    1
    D�tails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2023
    Messages : 1
    Par d�faut C++17 cr�e une utilisation pratique de l'op�rateur d'indexation de tableau r�trograde, par Raymond Chen
    C++17 cr�e une utilisation pratique de l'op�rateur d'indexation de tableau r�trograde, par Raymond Chen, Senior Software Engineer chez Microsoft

    Il est bien connu que si a est un pointeur ou un tableau et i un entier, alors a[i] et i[a] sont �quivalents en C et C++, ce qui donne lieu � des hilarit�s telles que :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    void haha()
    {
        int a[5];
        for (i = 0; i < 5; i++) {
            i[a] = 42;
        }
    }
    Il y a tr�s peu d'utilisation pratique pour cette �quivalence, � part pour faire des farces aux gens�.

    Et puis C++17 est arriv�.

    L'un des changements apport�s au langage de base en C++17 a �t� le renforcement de l'ordre des r�gles d'�valuation, formellement connu sous le nom de s�quen�age. Nous avions d�j� rencontr� ce probl�me en �tudiant un crash qui semblait concerner une op�ration std::move.

    L'une des op�rations qui a re�u un ordre d'�valuation d�fini est l'op�rateur d'indice. � partir de C++17, a[b] �value toujours a avant d'�valuer b.

    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
    int* p;
    int index();
     
    auto test()
    {
        return p[index()];
    }
     
    // Compiled as C++14
     
        sub     rsp, 40
        call    index       ; call index first
        movsxd  rcx, rax
        mov     rax, p      ; then fetch p
        mov     eax, [rax + rcx * 4]
        add     rsp, 40
        ret
     
    // Compiled as c++17
     
        push    rbx
        sub     rsp, 32
        mov     rbx, p      ; fetch p first
        call    index       ; then call index
        movsxd  rcx, rax
        mov     eax, [rbx + rcx * 4]
        add     rsp, 32
        pop     rbx
        ret
    Par cons�quent, si votre �valuation de l'index peut avoir un effet secondaire sur l'�valuation du pointeur, vous pouvez inverser l'ordre pour forcer l'index � �tre calcul� en premier.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    auto test()
    {
        return index()[p];
    }
    �tonnez vos amis ! D�concertez vos ennemis !

    Bavardage en prime : clang impl�mente cela correctement, mais msvc (v19) et gcc (v13) se trompent d'ordre et chargent p avant d'appeler index. (Par comparaison, icc se trompe aussi, mais dans l'autre sens : Il charge toujours p en dernier).

    � Une autre utilisation pratique est de contourner toute surcharge possible de l'op�rateur [], comme indiqu� dans le chapitre 14 de Imperfect C++ :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    #define ARRAYSIZE(a) (sizeof(a) / sizeof(0[a]))
    En inversant l'ordre dans 0[a], cela permet de contourner une �ventuelle surcharge de a[].

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    std::vector<int> v(5);
    int size = ARRAYSIZE(v); // compiler error
    Cependant, cette m�thode n'est pas infaillible. Il suffit de cr�er un imb�cile plus astucieux : Si v est un pointeur ou un objet convertible en pointeur, alors ce pointeur ira volontiers � l'int�rieur de 0[...].

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct Funny
    {
        operator int*() { return oops; }
        int oops[5];
        int extra;
    };
     
    Funny f;
    int size1 = ARRAYSIZE(f); // oops: 6
     
    int* p = f;
    int size2 = ARRAYSIZE(p); // oops: 1
    Heureusement, vous n'avez pas besoin d'astuces macro. Vous pouvez laisser les fonctions constexpr du C++ faire le travail � votre place :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    template<typename T, std::size_t N>
    constexpr std::size_t array_size(T(&)[N]) { return N; }

    Et vous ?

    Qu'en pensez-vous ?

    Voir aussi :

    Les travaux sur la norme C++ 23 sont termin�s et cette nouvelle version porte le nom de code "Pandemic Edition", C++ 23 cherche � am�liorer la vitesse de compilation et l'hygi�ne du code

    Zig, pr�sent� comme une alternative moderne au C, fait son apparition dans le top 50 de l'indice Tiobe des langages les plus populaires. Carbon, l'alternative C++ de Google, n'est class� que 168e

    C++ vs Rust : une comparaison pratique de la vitesse de compilation et de test des deux langages de programmation, par Matthew Glazar, ing�nieur en g�nie logiciel

  2. #2
    Mod�rateur
    Avatar de grunk
    Homme Profil pro
    Lead d�v - Architecte
    Inscrit en
    Ao�t 2003
    Messages
    6 693
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : Lead d�v - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 6 693
    Par d�faut
    Qu'en pensez-vous ?
    Que c'est exactement ces trucs qui font que ca me manque pas du tout de plus faire de C++ dans mon nouveau job
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre chevronn�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Septembre 2019
    Messages
    325
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2019
    Messages : 325
    Par d�faut
    Je ne suis pas s�r de bien comprendre.

    Va �tre une �criture valide ? C'est pour faciliter la lisibilit� du code, c'est �a ?

    Sinon, les d�cideurs derri�re la norme C++ ne pourraient pas faire des trucs utiles pour la vie de tous les jours, pour faciliter l'�criture et la lisibilit� ?

  4. #4
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 200
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 200
    Billets dans le blog
    4
    Par d�faut
    Citation Envoy� par Raymond Chen Voir le message
    Et vous ?

    Qu'en pensez-vous ?
    Gadget, et je vois pas comment quiconque de senc� pourrait �crire un tel code ou le laisser passer en revue.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  5. #5
    jmv
    jmv est d�connect�
    Membre chevronn� Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    D�tails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par d�faut
    Citation Envoy� par grunk Voir le message
    Que c'est exactement ces trucs qui font que ca me manque pas du tout de plus faire de C++ dans mon nouveau job
    +1
    Il est bien connu que si a est un pointeur ou un tableau et i un entier, alors a[i] et i[a] sont �quivalents en C et C++
    Alors �a, je ne savais pas ! depuis quand ?

  6. #6
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 864
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 864
    Par d�faut
    Citation Envoy� par jmv Voir le message
    Alors �a, je ne savais pas ! depuis quand ?
    Effectivement c'est la question depuis quand ?

    Mais je pense que c'est 1 peu 1 fausse question
    C'est plus le compilateur qui convertit a[i] en *(a + i) � et donc c'est interchangeable *(i + a).
    Apr�s il faudrait 1 expert gcc/ LLVM pour me dire si j'ai tord

  7. #7
    jmv
    jmv est d�connect�
    Membre chevronn� Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    D�tails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par d�faut
    Effectivement, �a parait logique.
    Donc la r�ponse � ma question initiale serait : depuis qu'il existe un compilateur C.

  8. #8
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 605
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 63
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 605
    Par d�faut
    L'�quivalence a[i] === *(a+i) === i[a] est la base du C, existe donc depuis le d�but.
    Il existe un petit �cart en C++, le r�sultat de a[i] est une x-value au lieu d'une l-value si l'expression a n'est pas une l-value, donc a[i] n'est pas totalement �quivalent � i[a].

    Ce qui change c'est que d�sormais l'ordre d'ex�cution est garanti, du moins depuis le C++17, je ne sais pas pour le C.
    Donc pour fct1()[ fct2() ], on sait quelle fonction est appel�e en premier, c'est fct1(). Mais par exemple pour fct1() = fct2();, on commence par fct2(). �a me parait complexe de se souvenir de �a!

    De plus, cette "astuce" me parait doublement contreproductive en C++, pour 2 raisons:
    - on ne devrait pas utiliser l'arithm�tique des pointeurs en C++. Il est pr�f�rable d'utiliser les objets faits pour cela.
    - si on veut une chronologie pr�cise. Il est bien plus lisible et s�r de d�composer l'expression:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    auto&&  x = fct1();
    auto&&  y = fct2();  // ou dans l'ordre inverse
    auto  z = x[ y ];
    Les analyseurs de code doivent syst�matiquement tagger une ligne auto z = fct(1)[ fct2() ] comme �tant dangereuse.

Discussions similaires

  1. Utilisation pratique d'une douchette QR code
    Par symfonyc dans le forum G�n�ral Conception Web
    R�ponses: 1
    Dernier message: 17/05/2017, 17h45
  2. Est-ce une bonne pratique d'utiliser les DELETE CASCADE ?
    Par Tanebisse dans le forum D�veloppement
    R�ponses: 21
    Dernier message: 14/10/2016, 14h20
  3. [Swing] Utiliser du HTML: Une bonne pratique ?
    Par dranzul dans le forum AWT/Swing
    R�ponses: 6
    Dernier message: 28/07/2011, 10h42
  4. Quel CMS pour une utilisation personnelle ?
    Par lennelei dans le forum EDI, CMS, Outils, Scripts et API
    R�ponses: 4
    Dernier message: 30/08/2009, 12h21
  5. Quels SGBD sont gratuits pour une utilisation commerciale ?
    Par laffreuxthomas dans le forum D�cisions SGBD
    R�ponses: 28
    Dernier message: 15/03/2005, 17h51

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