Re[3]: доступ к элементам структуры
От: Максим2006 Беларусь  
Дата: 29.05.07 14:18
Оценка:
Здравствуйте, bookevg, Вы писали:

B>Здравствуйте, Максим2006, Вы писали:


М>>Здравствуйте, bookevg, Вы писали:


М>>Можно завести вспомогательные классы, правда тогда регистровое представление функцией нужно сделать (у меня так получилось, но возможны варианты).


B>Вроде все получается, но вот только расход памяти большой: для 16=тиразрядного числа: 16 * 4байта * 4указателя(при 32-хразрядных указателях) + 2байта (само число) = 258 — для моего арм-процессора это много. Таких регистров м.б. 250 штук.


Это ведь непрямой путь к цели. Тут неизбежны накладные расходы. Прямой путь — это ввод методов по установке флагов. Кое-что можно перенести на рантайм, но это уже хаки по-любому.
    struct StatusData
    {
    private:
        void SetStatus(unsigned status) { m_DataUnion.dataBit.nStatus = status; }
        unsigned GetStatus() { return m_DataUnion.dataBit.nStatus; }

        void SetReady(unsigned ready) { m_DataUnion.dataBit.nReady = ready; };
        unsigned GetReady() { return m_DataUnion.dataBit.nReady; };

        void SetReg(unsigned reg) { m_DataUnion.data = reg; };
        unsigned GetReg() { return m_DataUnion.data; };

    private:
        struct StatusField
        {
            void operator=(unsigned ready) { pThis()->SetStatus(ready); }
            operator unsigned() { return pThis()->GetStatus(); }

        private:
            StatusData* pThis() {
                StatusField StatusData::* pmem = &StatusData::Status;
                return (StatusData*)((__int64)(this) - *(__int64*)&pmem);
            }
        };

        struct ReadyField
        {
            void operator=(unsigned ready) { pThis()->SetReady(ready); }
            operator unsigned() { return pThis()->GetReady(); }

        private:
            StatusData* pThis() {
                ReadyField StatusData::* pmem = &StatusData::Ready;
                return (StatusData*)((__int64)(this) - *(__int64*)&pmem);
            }
        };

        struct RegField
        {
            void operator=(unsigned reg) { pThis()->SetReg(reg); }
            operator unsigned() { return pThis()->GetReg(); }

        private:
            StatusData* pThis() {
                RegField StatusData::* pmem = &StatusData::Reg;
                return (StatusData*)((__int64)(this) - *(__int64*)&pmem);
            }
        };

    public:
        StatusField Status;
        ReadyField Ready;
        RegField Reg;

    private:
        struct Data {
            unsigned nStatus : 1;
            unsigned nReady : 1;
        };

        union DataUnion {
            Data dataBit;
            unsigned data;
        };

        DataUnion m_DataUnion;
    };
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.