Другие языки программирования и технологии
C++. Типы данных. Создание типа данных.
Вопрос следующего характера: возможно ли в C++ создать свой тип данных, который бы занимал строго определенный общем памяти? К примеру, 5 бит, 10 бит и т.п. Если это возможно, то можете популярно (я пока еще только учусь) объяснить как, или, что лучше, дать ссылку на то, что можно почитать по данной теме. Я просто не представляю какой тут можно задать запрос для поиска... Заранее спасибо.
Минимальная граница для адресации процессора - 1 байт. Рекоммендуемая - 4 байта.
Если нужна скорость, создаете тип как структуру с массивом из unsigned int (размер массива - количество битов, деленное на 32, с округлением в большую сторону, тогда 5 бит и 10 бит будут занимать в памяти 32 бита)
Если нужна экономия памяти, то создаете структуру с массивом из unsigned char (в этом случае 5 бит будет занимать в памяти 8, а 10 - 16 бит)
Упаковать несколько различных типов в структуру можно указав количество занимаемых бит, например:
struct Status
{
bool Ready : 1;
bool Errorl : 1;
unsigned int LastOperationCode : 4 ;
unsigned int ErrorCode : 4;
}
Есть еще один вариант, если Вам действительно нужна самая максимальная экономия памяти (например, огромнейшие массивы данных или минимальное количество памяти как в микроконтроллерах) . Естественно, в этом случае тип для еденичного элемента будет таким же, как и в первом случае - массив из байтов или двойных слов. Однако, для массива таких элементов надо будет создать свой собственный тип данных.
class Bitarray
{
private:
unsigned char *Array;
}
Определить в нем конструктор, резервирующий память для массива (например, для случая 5-байтного типа) :
Bitarray::Bitarray( int size )
{
Array = (unsigned char*)malloc(1+size*5/8);
}
А также функции для чтения и записи
unsigned char Bitarray::Get(int index)
{
int ba = index*5/8;
return ((Array[ba]>>(index*5-ba*8)) | (Array[ba+1] << ((ba+1)*8-index*5)) & 31;
}
Запись - аналогично. Ну и так далее и тому подобное. Идея, надеюсь, понятна.
Про создание собственных типов - почитайте Bjarne Stroustrup "The C++ Programming Language", там есть немного про создание битовых полей и описание необходимых операций (например, для извлечения битовых частей из переменной) .
Более подробно про битовые поля наверное будет написано в книжках про C или ассемблер.
Если нужна скорость, создаете тип как структуру с массивом из unsigned int (размер массива - количество битов, деленное на 32, с округлением в большую сторону, тогда 5 бит и 10 бит будут занимать в памяти 32 бита)
Если нужна экономия памяти, то создаете структуру с массивом из unsigned char (в этом случае 5 бит будет занимать в памяти 8, а 10 - 16 бит)
Упаковать несколько различных типов в структуру можно указав количество занимаемых бит, например:
struct Status
{
bool Ready : 1;
bool Errorl : 1;
unsigned int LastOperationCode : 4 ;
unsigned int ErrorCode : 4;
}
Есть еще один вариант, если Вам действительно нужна самая максимальная экономия памяти (например, огромнейшие массивы данных или минимальное количество памяти как в микроконтроллерах) . Естественно, в этом случае тип для еденичного элемента будет таким же, как и в первом случае - массив из байтов или двойных слов. Однако, для массива таких элементов надо будет создать свой собственный тип данных.
class Bitarray
{
private:
unsigned char *Array;
}
Определить в нем конструктор, резервирующий память для массива (например, для случая 5-байтного типа) :
Bitarray::Bitarray( int size )
{
Array = (unsigned char*)malloc(1+size*5/8);
}
А также функции для чтения и записи
unsigned char Bitarray::Get(int index)
{
int ba = index*5/8;
return ((Array[ba]>>(index*5-ba*8)) | (Array[ba+1] << ((ba+1)*8-index*5)) & 31;
}
Запись - аналогично. Ну и так далее и тому подобное. Идея, надеюсь, понятна.
Про создание собственных типов - почитайте Bjarne Stroustrup "The C++ Programming Language", там есть немного про создание битовых полей и описание необходимых операций (например, для извлечения битовых частей из переменной) .
Более подробно про битовые поля наверное будет написано в книжках про C или ассемблер.
Байтовую адресацию памяти ещё никто не отменял. Нельзя сохранить в памяти биты, можно только байты, которые потом транслировать в биты. По-моему так. А следовательно, зачем изобретать велосипед?
Можно. Скачайте себе учебное пособие по С++ или другую учебную литературу по программированию в интернете её полно. Типизация данных это один из основных вопросов в программировании. Ответ вы найдёте в любом учебнике по программированию на языке С++.
Похожие вопросы
- C# почему когда создаю тип данных byte - он его автоматически преобразовывает в тип int?
- [C++] Программа крашится если тип данных LPSTR
- Учу C++! Уже знаю: типы данных, циклы. условия, привидения и т. д учу 5дней. вот программа! Как норм за 5 дней?
- Тип данных в паскале
- Что имеется ввиду под 4 байтами у типа данных int?(С++)
- Есть ли в программировании основные (фундаментальные) типы данных, от которых берут начало другие типы?
- C++ Про выбор типа данных. Int, char и т. д.
- Перечислите основные типы данных
- Создание базы данных на Turbo C
- Как преобразовать тип string к типу int? C++