управление памятью — Каков размер набора битов в переполнении стека

Я хочу знать, как на самом деле bitset выделяет память. Я читал из какого-то блога, что он занимает память в битах. Однако, когда я запускаю следующий код:

   bitset<3> bits = 001;
cout<<sizeof(bits);

Я получаю вывод как 4. Каково объяснение этого?

Также есть метод для выделения места в битах в C ++?

9

Решение

Вы можете приблизить sizeof(bitset<N>) как:

  1. Если внутреннее представление 32-битное (как без знака в 32-битных системах) как 4 * ((N + 31) / 32)
  2. Если внутреннее представление 64-битное (например, unsigned long в 64-битных системах) как 8 * ((N + 63) / 64)

Кажется, первое верно: 4 * ((3 + 31) / 32) является 4

7

Другие решения

Я получаю вывод как 4. Каково объяснение этого?

В стандарте нет информации о том, как bitset должно быть реализовано. Это реализация определена, посмотрите на bitset header вашего компилятора.

Также есть метод для выделения места в битах в C ++?

Нет, в C ++ нет способа выделить место в битах.

7

Ваш ЦП работает не с отдельными битами, а с байтами и словами. В вашем случае sizeof (биты) приводит к 4, потому что компилятор решил выровнять эту структуру данных с 4 байтами.

7

Обычно на 32-разрядном процессоре компилятор делает выделенный объем памяти кратным 4 байтам, и поэтому ближайший кратный 4, превышающий 3/8, составляет 4 байта.

1

Вы не можете адресовать отдельные биты, младший адресный блок — это байт. Так что нет, вы не можете выделить биты точно.

Другая вещь — это заполнение — вы почти всегда получаете больше байтов, чем вы просили, это для целей оптимизации. Адресация байтов не на границах 32 байт часто обходится дорого, а адресация байтов на 64-разрядных процессорах, которые не находятся на границах 64 байт, приводит к исключению. (говоря о платформе Intel.)

0