Другие языки программирования и технологии

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 или ассемблер.
ES
Erlan Sembiev
551
Лучший ответ
Байтовую адресацию памяти ещё никто не отменял. Нельзя сохранить в памяти биты, можно только байты, которые потом транслировать в биты. По-моему так. А следовательно, зачем изобретать велосипед?
Можно. Скачайте себе учебное пособие по С++ или другую учебную литературу по программированию в интернете её полно. Типизация данных это один из основных вопросов в программировании. Ответ вы найдёте в любом учебнике по программированию на языке С++.