Я хочу знать, как на самом деле bitset выделяет память. Я читал из какого-то блога, что он занимает память в битах. Однако, когда я запускаю следующий код:
bitset<3> bits = 001;
cout<<sizeof(bits);
Я получаю вывод как 4. Каково объяснение этого?
Также есть метод для выделения места в битах в C ++?
Вы можете приблизить sizeof(bitset<N>)
как:
4 * ((N + 31) / 32)
8 * ((N + 63) / 64)
Кажется, первое верно: 4 * ((3 + 31) / 32)
является 4
Я получаю вывод как 4. Каково объяснение этого?
В стандарте нет информации о том, как bitset
должно быть реализовано. Это реализация определена, посмотрите на bitset header
вашего компилятора.
Также есть метод для выделения места в битах в C ++?
Нет, в C ++ нет способа выделить место в битах.
Ваш ЦП работает не с отдельными битами, а с байтами и словами. В вашем случае sizeof (биты) приводит к 4, потому что компилятор решил выровнять эту структуру данных с 4 байтами.
Обычно на 32-разрядном процессоре компилятор делает выделенный объем памяти кратным 4 байтам, и поэтому ближайший кратный 4, превышающий 3/8, составляет 4 байта.
Вы не можете адресовать отдельные биты, младший адресный блок — это байт. Так что нет, вы не можете выделить биты точно.
Другая вещь — это заполнение — вы почти всегда получаете больше байтов, чем вы просили, это для целей оптимизации. Адресация байтов не на границах 32 байт часто обходится дорого, а адресация байтов на 64-разрядных процессорах, которые не находятся на границах 64 байт, приводит к исключению. (говоря о платформе Intel.)