44 votes

Déclarer des variables en haut de la fonction ou dans des portées distinctes ?

Quelle est la méthode préférée, la méthode 1 ou la méthode 2 ?

Méthode 1 :

 LRESULT CALLBACK wpMainWindow(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
        case WM_PAINT:
        {
            HDC hdc;
            PAINTSTRUCT ps;

            RECT rc;
            GetClientRect(hwnd, &rc);           

            hdc = BeginPaint(hwnd, &ps);
            // drawing here
            EndPaint(hwnd, &ps);
            break;
        }
        default: 
            return DefWindowProc(hwnd, msg, wparam, lparam);
    }
    return 0;
}

Méthode 2 :

 LRESULT CALLBACK wpMainWindow(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rc;

    switch (msg)
    {
        case WM_PAINT:
            GetClientRect(hwnd, &rc);

            hdc = BeginPaint(hwnd, &ps);
            // drawing here
            EndPaint(hwnd, &ps);
            break;

        default: 
            return DefWindowProc(hwnd, msg, wparam, lparam);
    }
    return 0;
}

Dans la méthode 1, si msg = WM_PAINT lorsque la fonction wpMainWindow est appelée, alloue-t-elle de la mémoire pour toutes les variables de la pile au début ? ou seulement lorsqu'il entre dans la portée WM_PAINT ?

La méthode 1 n'utiliserait-elle la mémoire que lorsque le message est WM_PAINT, et la méthode 2 utiliserait-elle la mémoire quel que soit le msg égalé ?

7voto

Ben Voigt Points 151460

J'aime la méthode 3 :

 LRESULT wpMainWindowPaint(HWND hwnd)
{
    HDC hdc;
    PAINTSTRUCT ps;

    RECT rc;
    GetClientRect(hwnd, &rc);           

    hdc = BeginPaint(hwnd, &ps);
    // drawing here
    EndPaint(hwnd, &ps);
    return 0;
}

LRESULT CALLBACK wpMainWindow(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
        case WM_PAINT:      return wpMainWindowPaint(hwnd);
        default:            return DefWindowProc(hwnd, msg, wparam, lparam);
    }
}

S'il mérite sa propre portée à des fins d'organisation, il mérite sa propre fonction. Si vous vous inquiétez de la surcharge des appels de fonction, faites-le en ligne.

5voto

xtofl Points 22333

Étant donné que c'est le travail du compilateur d'optimiser mon code, et qu'une heure de temps de compilation est bien moins chère qu'une heure de mon temps, et mon temps est perdu si je dois faire défiler le code de haut en bas pour voir où une variable a été déclarée, Je pense que mon entreprise veut que je garde tout aussi local que possible.

Je ne parle même pas du « plus petit bloc », mais « au plus près de l'endroit où il est utilisé » !

 LRESULT CALLBACK wpMainWindow(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) 
{ 
    switch (msg) 
    { 
        case WM_PAINT: 
        { 
            RECT rc; 
            GetClientRect(hwnd, &rc);            

            { // sometimes I even create an arbitrary block 
              // to show correlated statements.
              // as a side-effect, the compiler may not need to allocate space for 
              // variables declared here...
              PAINTSTRUCT ps; 
              HDC hdc = BeginPaint(hwnd, &ps); 
              // drawing here 
              EndPaint(hwnd, &ps); 
            }
            break; 
        } 
        default:  
            return DefWindowProc(hwnd, msg, wparam, lparam); 
    } 
    return 0; 
} 

3voto

Steve Townsend Points 36948

Définissez les variables dans la portée la plus étroite où elles sont pertinentes. Il n'y a aucune raison d'utiliser la méthode 2 ci-dessus à mon avis.

L'espace de pile n'est susceptible d'être utilisé que lorsque les variables sont dans la portée. Comme le souligne @paxdiablo, vos locaux peuvent se retrouver dans des registres plutôt que sur la pile, si le compilateur peut trouver l'espace pour eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X