Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Сколько памяти занимает тип bool


Автор: 88andrey 23.4.2007, 10:55
1 – байт или 1 – бит.

Автор: Fazil6 23.4.2007, 10:58
Код

std::cout << sizeof(b);

1 байт. Меньше он и не может быть. Хотя в контейнере vector<bool> хранится в битах

Автор: HappyLife 23.4.2007, 11:25
Fazil6, Да не совсем.... Такой контейнер неедопустим, потому что будет храниться в байтах...
bitset вот в нем в битах.

Автор: zkv 23.4.2007, 11:34
Цитата(HappyLife @  23.4.2007,  11:25 Найти цитируемый пост)
Fazil6, Да не совсем.... Такой контейнер неедопустим, потому что будет храниться в байтах...

хе-хе... Это вы сами придумали, или подсказал кто?

Автор: Fazil6 23.4.2007, 11:37
Цитата(HappyLife @  23.4.2007,  11:25 Найти цитируемый пост)
Fazil6, Да не совсем.... Такой контейнер неедопустим, потому что будет храниться в байтах...

не совсем понимаю почему недопустимо vector<bool> , хотя это и не контейнер STL (тут согласен, что я неудачно выразился). Обычно в vector<bool> элементы хранятя как раз в битах. 
vector<bool> по стандарту вполне допустим, хотя и рекомендуется избегать такой конструкции.

Автор: HappyLife 23.4.2007, 11:41
zkv, да, попутал рамсы. сорри.
Фишка в том, что адресацию, невозможно создать к элементам. и сделать
Код

bool *p = v.begin(); невозможно


Автор: NightmareZ 23.4.2007, 12:48
Цитата(HappyLife @ 23.4.2007,  11:41)
zkv, да, попутал рамсы. сорри.
Фишка в том, что адресацию, невозможно создать к элементам. и сделать
Код

bool *p = v.begin(); невозможно

Тебе нравится говорить очевидные общеизвестные вещи, особенно, когда никто их не спрашивает?

Автор: HappyLife 23.4.2007, 12:57
NightmareZ, нет не особо. но мне просто главнее не задавать бессмысленных вопросов. нежели дать бессмысленный ответ.... наверное так.

Автор: vinter 23.4.2007, 14:14
Цитата(NightmareZ @  23.4.2007,  12:48 Найти цитируемый пост)
Тебе нравится говорить очевидные общеизвестные вещи, особенно, когда никто их не спрашивает?

а ты че наезжаешь? не нравится сиди спокойно, форум не для тебя одного

Автор: betal 23.4.2007, 15:23
Цитата(88andrey @  23.4.2007,  10:55 Найти цитируемый пост)
1 – байт или 1 – бит.???? 
 smile 

Автор: Earnest 23.4.2007, 15:51
Все, ребята, не заводитесь.

Автор: _ace_ 23.4.2007, 18:24
88andrey
конечно 1 бит то есть 8 микробит

Автор: JackYF 23.4.2007, 18:33
_ace_, ну это уже черезчур. Между прочим, может занимать и 1 бит... и даже не в стандартных контейнерах:

Код

struct mystruct
{
  bool p :1;
  unsigned short p2: 7;
};


Извинился бы ты...

Добавлено через 1 минуту и 7 секунд
Цитата(_ace_ @  23.4.2007,  18:24 Найти цитируемый пост)
конечно 1 бит то есть 8 микробит 

кстати, если подходить формально, то если бы бит делился, то в нем было бы
10^(-6) микробит.

Автор: archimed7592 23.4.2007, 18:37
Цитата(HappyLife @  23.4.2007,  11:41 Найти цитируемый пост)
Фишка в том, что адресацию, невозможно создать к элементам. и сделать
    
bool *p = v.begin(); невозможно
индусскую адресацию - да, невозможно...
люди пишут так:
Код
typedef std::vector<bool> container;
container v;
//...
container::iterator p = v.begin (); // возможно

Автор: Earnest 23.4.2007, 18:41
Цитата(_ace_ @  23.4.2007,  19:24 Найти цитируемый пост)
конечно 1 бит то есть 8 микробит 

Это шутка, надо полагать  smile 
JackYF, в твоем примере это вовсе не бул, хотя ты видишь это слово. Так же как второй элемент битовой структуры - вовсе не unsigned short...

Автор: JackYF 23.4.2007, 18:56
Цитата(Earnest @  23.4.2007,  18:41 Найти цитируемый пост)
JackYF, в твоем примере это вовсе не бул, хотя ты видишь это слово. Так же как второй элемент битовой структуры - вовсе не unsigned short... 


Ну с unsigned short - да, здесь понятно. Это я так, чтобы до восьми бит добить...
С bool - да, тут тоже, если формально подходить, то не bool.
Но вот функции свои - хранить/отдавать true/false он делает исправно.

sizeof(bool)==1, тут понятно.
Просто можно заюзать и более плотную схему, только и всего.

Автор: Mayk 23.4.2007, 18:59
Цитата(ISO/IEC JTC 1/SC22/WG21 N2135 (в простонародье --- драфт с++ за ноябрь 2006-ого года))

  5.3.3   Sizeof                                                                                               [expr.sizeof]
  The sizeof operator yields the number of bytes in the object representation of its operand. The operand is either an
  expression, which is not evaluated, or a parenthesized type-id. The sizeof operator shall not be applied to an expression
  that has function or incomplete type, or to an enumeration type before all its enumerators have been declared, or to
  the parenthesized name of such types, or to an lvalue that designates a bit-field. sizeof(char), sizeof(signed
  char) and sizeof(unsigned char) are 1. The result of sizeof applied to any other fundamental type (3.9.1) is
  implementation-defined. [ Note: in particular, sizeof(bool) and sizeof(wchar_t) are implementation-defined.73)
  -- end note ] [ Note: See 1.7 for the definition of byte and 3.9 for the definition of object representation. -- end note ]

73) sizeof(bool) is not required to be 1.


Автор: Earnest 23.4.2007, 19:19
Цитата(JackYF @  23.4.2007,  19:56 Найти цитируемый пост)
Но вот функции свои - хранить/отдавать true/false он делает исправно

Ну так я ведь могу написать с использованием флагов что-то вроде return (my_flags & boolFlag) != 0. Ровно то же самое и компилятор делает, только сам, за что спасибо.
Mayk, точно, вот вроде помнила, что не обязательно sizeof (bool) == 1, но сомневалась, потому как давно читала... Ясно только что не 8 микробит... smile 

Автор: JackYF 23.4.2007, 19:30
Цитата(Earnest @  23.4.2007,  19:19 Найти цитируемый пост)
Ровно то же самое и компилятор делает, только сам, за что спасибо.

Да, конечно. Но, в принцие, это и есть назначение булевской переменной smile


Цитата(Mayk @  23.4.2007,  18:59 Найти цитируемый пост)
73) sizeof(bool) is not required to be 1.

Ну, со стандартом спорить глупо. Но хотел бы я посмотреть на компилятор, у которого sizeof(bool)>1. smile

Автор: betal 23.4.2007, 20:40
Цитата(Earnest @  23.4.2007,  15:51 Найти цитируемый пост)
Все, ребята, не заводитесь. 

 smile    smile 

Автор: Любитель 23.4.2007, 23:10
Цитата(JackYF @  23.4.2007,  19:30 Найти цитируемый пост)
Но хотел бы я посмотреть на компилятор, у которого sizeof(bool)>1

MS VC++/CLI. Это, конечно, не совсем плюсы - но всё-таки. Суть в том, что вполне реально.

Цитата(JackYF @  23.4.2007,  18:33 Найти цитируемый пост)
кстати, если подходить формально, то если бы бит делился, то в нем было бы10^(-6) микробит.

Во-первых - не минус явно. smile А то в одном бите дробное число микробит...  smile То есть микробит больше бита??? Во-вторых, скорее 2^20. Ведь килобиты, мегабиты такая судьба постигла...

Автор: Dude03 24.4.2007, 12:38
4 байта=) В стеке=). Вопрос уже неоднократно поднимался на форуме.
Мой совет: заюзайте возможность компилятора генерить ассемблерный листинг и загляните в него. И сразу станет легче жить=)

Автор: JackYF 24.4.2007, 16:40
Цитата(Любитель @  23.4.2007,  23:10 Найти цитируемый пост)
Во-первых - не минус явно.

Ну да - естественно, +.


Цитата(Любитель @  23.4.2007,  23:10 Найти цитируемый пост)
Во-вторых, скорее 2^20.

Ну вообще тут спорный вопрос. Компьютерные килобайты, мегабайты, гигабайты, терабайты и экзабайты переопределены...
А вообще микро - 10^-6...

Так что тут еще неизвестно  smile 


Цитата(Dude03 @  24.4.2007,  12:38 Найти цитируемый пост)
4 байта=) В стеке=)

Ну, переменные не всегда в стеке лежат smile



Цитата(Dude03 @  24.4.2007,  12:38 Найти цитируемый пост)
заюзайте возможность компилятора генерить ассемблерный листинг 

Не-е-е... smile Так неинтересно ;)

Цитата(Любитель @  23.4.2007,  23:10 Найти цитируемый пост)
MS VC++/CLI. Это, конечно, не совсем плюсы - но всё-таки. Суть в том, что вполне реально.

Хм... мдя. Ужас. А если еще похохмить, то компилятора ms vc++/cli я таки еще не видел smile

Автор: Любитель 28.4.2007, 17:01
Цитата(JackYF @  24.4.2007,  16:40 Найти цитируемый пост)
компилятора ms vc++/cli я таки еще не видел

Почему? Я в названии ошибся (если да - поправь, я не знал)? Компилер, строго говоря, там один - cl.exe, разные ключики...

Автор: JackYF 28.4.2007, 17:17
Цитата(Любитель @  28.4.2007,  17:01 Найти цитируемый пост)
Почему? Я в названии ошибся (если да - поправь, я не знал)? Компилер, строго говоря, там один - cl.exe, разные ключики...


Э  smile да нет, ты все правильно написал...

Я не видел этого компилятора. Ну то есть он есть, но я его не видел smile))

Цитата(JackYF @  24.4.2007,  16:40 Найти цитируемый пост)
А если еще похохмить

Это же хохма была smile

Автор: Любитель 28.4.2007, 18:01
Цитата(JackYF @  23.4.2007,  19:30 Найти цитируемый пост)
Но хотел бы я посмотреть на компилятор

Вот я и предложил посмотреть на него smile Впрочем что смотреть - обычный экзешник. Ничего красивого. Консоль, она и в Африке консоль (хотя не уверен...)

Автор: JackYF 28.4.2007, 18:06
Цитата(Любитель @  23.4.2007,  23:10 Найти цитируемый пост)
Но хотел бы я посмотреть на компилятор, у которого sizeof(bool)>1
MS VC++/CLI


Кстати... а зачем ему sizeof(bool) > 1? памяти, что ли, под true/false не хватает? smile. Или внутренние заморочки?

Автор: Любитель 28.4.2007, 18:09
Оптимизация скорости в ВМ, если не ошибаюсь. Впрочем, вопрос к дотнетчикам. К тому же там уже была такая тема (по шарпу, но какая разница?).

Автор: Sartorius 28.4.2007, 18:12
 на БОРе как то такой код видел из реального проекта между прочим  smile 
Код

if(bFlag.ToString().length() > 4)
{
...
}

  Так что одного байта не всегда хватает... smile 

Автор: Любитель 28.4.2007, 18:16
Sartorius, не понял. Если bFlag типа bool, то ToString (если я жутко не туплю) возвращает его строковое представление - "true/false". Код правда тупой до ужаса (или в этом суть smile )

Автор: Sartorius 28.4.2007, 18:18
Цитата

в этом суть   smile 
 

Автор: JackYF 28.4.2007, 18:22
Цитата(Sartorius @  28.4.2007,  18:12 Найти цитируемый пост)
на БОРе как то такой код видел из реального проекта между прочим  smile 
Выделить всёкод C#
1:
2:
3:
4:
    
if(bFlag.ToString().length() > 4)
{
...
}


Да, было похожее. Впрочем, в этом случае программисту надо сделать remount hands, а если не поможет, то увольняться smile

Автор: Любитель 28.4.2007, 18:26
Даа. Вот зя это можно пальцы ломать (я не против), а то вот в соседнем топике зверствуют... Впрочем, мож у них такие шутки своеобразные (в виде такого кода)?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)