1 бит на bool в массиве C ++ - PullRequest
       61

1 бит на bool в массиве C ++

5 голосов
/ 29 октября 2010
bool fp[81];

Насколько я понимаю, fp следует использовать байты ceil (81/8), потому что они последовательно

Я прав?

Как я могу доказать это?

Ответы [ 7 ]

10 голосов
/ 29 октября 2010

Нет, размер вашего буфера определяется реализацией. См. Цитату из стандарта ниже.

Следовательно, размер, который вы можете ожидать, равен 81 * X, где X - это размер bool, который определяется реализацией.

$ 5.3.3 / 1 - «Оператор sizeof возвращает количество байтов в объектном представлении своего операнда. Операнд является либо выражением, которое не вычисляется, либо идентификатором типа в скобках. Оператор sizeof не должен быть примененным к выражению, которое имеет функцию или неполный тип, или к типу перечисления до того, как все его перечислители были объявлены, или к названию таких типов в скобках, или к lvalue, который обозначает битовое поле. sizeof (символ), sizeof (символ со знаком) и sizeof (символ без знака) равны 1; Результат sizeof, примененный к любому другому фундаментальному типу (3.9.1), определяется реализацией. [ Примечание: в частности, sizeof (bool) и sizeof (wchar_t) определяются реализацией.69) ] [Примечание: см. 1.7 для определения байта и 3.9 для определения представления объекта. ]

4 голосов
/ 29 октября 2010

нет, это 81*sizeof(bool), что, скорее всего, 81 байт

3 голосов
/ 29 октября 2010

Вы можете узнать хранилище, используемое любым объектом или типом, с помощью sizeof:

int main() {
  bool fp[81];
  cout << sizeof fp << '\n';
  cout << sizeof(bool[81]) << '\n';
  return 0;
}
2 голосов
/ 29 октября 2010

вы можете проверить его размер, используя sizeof(fp), что в моем случае дает 81

2 голосов
/ 29 октября 2010

Нет, каждый bool обычно хранится отдельно ( обычно , в зависимости от вашего компьютера, 8 бит).Занимаемая память будет минимум 81 байт.

1 голос
/ 05 января 2011

Используйте набор битов, если вы хотите быть уверенным, что каждый бит будет рассматриваться как бит вместо использования байта для целого значения:

#include <bitset>
using namespace std;
#define SIZE 1000;
int main()
{
bitset<SIZE> bit_set; // unfortunately the size of a bitset is determined at compile time
bit_set.flip();
bit_set[232] = true;
}

Вы должны понимать, что это очень низкий уровень памятиограничение процессоров и их инструкций, так как они предназначены для поддержки слов битов, а не битов.Было бы неплохо, если бы для этой цели были добавлены некоторые инструкции, так как в этом случае набор битов просто сдвигает биты ...

Мне действительно нужно изучить сборку x86.

0 голосов
/ 29 октября 2010

Нет, bool - 8 бит.Используйте vector<bool> (специализированный битовый вектор) или bitset.

...