Re[5]: Сам код
От: _nn_  
Дата: 05.08.04 17:31
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>А хотя нет, так расходы памяти выше — в любом случае будет статически жить массив размером sizeof(DWORD)*8. В этом случае тогда можно постпуить еще проще — сразу макросом формировать соотв. строку статически и возвращать ее. В случае программного решения "большими" получаются только ненулевые цифры (т.е. <= push DWORD_PTR = 5 байт), а нулевые push BYTE_PRT = 2 байта). Вероятно, это все-таки выгоднее (медленнее, но выгоднее).


AS>Вот бы как-нибудь избавиться от этого оверхеда... я пока вижу только один вариант — списки типов и Const2Type, в этом случае размер строки будет с точностью до sizeof(DWORD), да и избавимся от ограничений на длину строки. Но как тогда формировать строку из списка типов, непонятно... Есть мысли?

Если их не будет это плохо

Немного более лучший вариант
static void MakeStr(LPTSTR szBuffer)
{
       static const DWORD a[]={n0,n1,n2,n3,n4,n5,n6,n7};
       static bool bInit;
       static TCHAR buf[name_size];
       if(bInit)
       {
            FlattenStr(buf,a ,7);
            bInit=true;
       }
       lstrcpy(szBuffer,buf);
}

Или так, избавляясь от копирования :
static LPCTSTR MakeStr()
{
       static const DWORD a[]={n0,n1,n2,n3,n4,n5,n6,n7};
       static bool bInit;
       static TCHAR buf[name_size];
       if(bInit)
       {
            FlattenStr(buf,a ,7);
            bInit=true;
       }
       return buf;
}


Но как замеченно вами, неоптимальный вариант.

В идеале сделать так, чтобы обработка массива DWORD происходила во время компиляции, а не выполнения программы.

Ну вот такая идея родилась :
// Макрос можно улучшить если будет необходимость
#define FLATTEN_STR(n,x) \
    ((n##x & 0xFF000000) >> 24), \
    ((n##x & 0x00FF0000) >> 16), \
    ((n##x & 0x0000FF00) >>  8), \
    ((n##x & 0x000000FF)),

template<DWORD n0 = 0,
        DWORD n1 = 0,
        DWORD n2 = 0,
        DWORD n3 = 0,
        DWORD n4 = 0,
        DWORD n5 = 0,
        DWORD n6 = 0,
        DWORD n7 = 0>
struct CNameId
{
    enum
    {
        name_size = (1<<7)-1,
        m_n0 = n0,
        m_n1 = n1,
        m_n2 = n2,
        m_n3 = n3,
        m_n4 = n4,
        m_n5 = n5,
        m_n6 = n6,
        m_n7 = n7
    };
    
    // нет вызова лишней функции
    static LPСTSTR MakeStr()
    {
        static const TCHAR buf[name_size]=
        {
            FLATTEN_STR(n,0)
            FLATTEN_STR(n,1)
            FLATTEN_STR(n,2)
            FLATTEN_STR(n,3)
            FLATTEN_STR(n,4)
            FLATTEN_STR(n,5)
            FLATTEN_STR(n,6)
            FLATTEN_STR(n,7)
        };
        return buf;
    }
};
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.