@yarushin_a

Как реализовать кастомный тип данных в c++ без использования нативной системой типов?

Всем привет. Например, я хочу реализовать свой собственный тип данных как int, не пользуясь при этом нативной системой типов. void *data; data = malloc(1); хочу чтоб мои числа помещались в 1 байт. Но как быть с этим дальше, то есть *data = 5; не сработает, компилятор видимо не понимает как работать с этим типом данных. Возможно ли вообще это сделать ? И заодно посоветуйте учебник, видимо, по CS чтоб я раскурил как это делается, желательно на русском.
  • Вопрос задан
  • 479 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
На самом деле такое возможно единственным методом: через ассемблерные вставки. Чем-нибудь типа
mov ecx, [data]
mov byte ptr[ecx], 5

Штатные типы позволяют, в числе прочего, интерпретировать те или иные байтовые данные разными методами. Вернёмся к одному байту. Он может быть…
• числом
• восемью флагами
• четырёхбитовым числом и четырьмя флагами
Ответ написан
Комментировать
@vanyamba-electronics
Сперва создаём класс, хранящий размер данных в байтах. Это нужно для того, чтобы определить наш тип как шаблон, для реюзабельности кода.
class MySize
{
public:
    static const unsigned int size;
};

Пусть будет 3 байта, например:
const unsigned int MySize::size = 3;
Затем определяем сам тип:
template <typename SizeT>
class MyValueT
{
protected:
    void* m_value;
public:
    MyValueT() {
        allocate_value();
    }
    void allocate_value() {
        m_value = malloc(SizeT::size);
        if (m_value == NULL)
            throw "Can't allocate MyValueT object";
        if (mlock(m_value, SizeT::size)) {
            free(m_value);
            throw "Can't lock MyValueT object";
        }
    }
    virtual ~MyValueT() {
        munlock(m_value, SizeT::size);
        free(m_value);
    }
    MyValueT(const MyValueT& src) {
        allocate_value();
        memcpy(m_value, src.m_value, SizeT::size);
    }
    operator int () const {
        int ret_val = 0;
        char* p = (char*) m_value;
        char* pv = (char*) &ret_val;
        for (unsigned int n = 0; n != SizeT::size && n != sizeof(int); ++n) {
            *pv = *p;
            p++;
            pv++;
        }
        return ret_val;
    }
    MyValueT& operator = (int val) {
        char* p = (char*) m_value;
        char* pv = (char*) &val;
        for (unsigned int n = 0; n != SizeT::size && n != sizeof(int); ++n) {
            *p = *pv;
            p++;
            pv++;
        }
        return *this;
    }
};

А вот, как его можно использовать в коде приложения:
int main() 
{
    MyValueT<MySize> my_value;
    int n_value = 0x7FF5F4F3;
    my_value = n_value;
    cout << hex << n_value << " " << my_value << endl;
    return 0;
}

Посмотреть, как он работает, можно на Joodle.com - Проект на Joodle.com.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы