WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  BOOL круче bool?

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   BOOL круче bool?
ADK опубликован 21-01-2002 13:26 MSK   Click Here to See the Profile for ADK   Click Here to Email ADK  
Где-то читал, что встроенный тип bool лучше не юзать, если нужна скорость. Якобы 32-x битный BOOL обрабатывается быстрее, так как влазит как раз в регистр. Это правда?
migel опубликован 21-01-2002 14:53 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Правда
SUnteXx опубликован 21-01-2002 15:32 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
И какова разница между ними (в плане скорости)?
ADK опубликован 22-01-2002 05:20 MSK     Click Here to See the Profile for ADK  Click Here to Email ADK     
?
migel опубликован 22-01-2002 00:31 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
[BOOL]
call ....
test EAX, EAX
jnz....

[bool]
call
and eax, 0xFF ;<<
test al, al
jnz

Valery опубликован 22-01-2002 14:59 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
migel, я не сильный знаток асма, но мне кажется что и без and eax, 0xFF с bool'ом должно работать, если конечно результат возвращается только в AL.
Так нафига туда компиллятор and тыкает? Или я неправ?
migel опубликован 22-01-2002 16:13 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Он просто проверяет 1 байт (согласно стандарту) поэтому и эти АНД раскидываются так как процедура возвращает в EAX не все а только часть его (AL) в остальной части двойного слова может быть все что угодно.
Kosha опубликован 22-01-2002 17:05 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
Не понял...
В инклюдах явно прописано:
typedef int BOOL; //;-)))
Дык чо спорить-то?
Kosha опубликован 22-01-2002 17:06 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
2migel:
И еще я не совсем понял, к чему этот асмовый код относится? %-{ }
Student опубликован 22-01-2002 17:39 MSK     Click Here to See the Profile for Student  Click Here to Email Student     
Товарищи !
Надо смотреть документацию по Intel. Там-же ЯСНО написано, что если после команды с использованием 32-битного регистра следующая команда использует часть этого-же регистра то образуется пауза в 8 тактов. Вот эта пауза и является главной задержкой при работе с bool.

>>
[BOOL]
call ....
test EAX, EAX
; >> паузы нет
jnz....

[bool]
call ...
and eax, 0xFF ;<<
test al, al
; >> ПАУЗА 8 ТАКТОВ
jnz ...

rivitna опубликован 22-01-2002 21:57 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
2 Student:
Приятно послушать специалиста! Насчет восьми тактов это сильно. :)))
Про появление дополнительных тактов при определенной адресации, при невыровненном коде и данных и т.д. и т.п. я знаю. Но это нечто новенькое. Наверное, читал фальшивку, написанную конкурентами Intel.

Суть кода, написанного Migel'ем дожна быть ясна и ребенку
[BOOL]
call ....
test EAX, EAX
jnz....

[bool]
call
and eax, 0xFF ;<<
test al, al
jnz

Без всяких высоких материй на интуитивном уровне должно быть ясно, что одна команда
test EAX, EAX
проще и эффективнее, чем две
and eax, 0xFF
test al, al

Тем более, что в первом случае это 2 байта кода, а во втором 7.
Арифметика предельно ясна!

Vovochka опубликован 23-01-2002 00:04 MSK     Click Here to See the Profile for Vovochka  Click Here to Email Vovochka     
Позвольте и мне встрять в это обсуждение. 32 разрядная BOOL, и байтовая bool. Что быстрее. Вы как-то увлеклись асмом.
"Без всяких высоких материй на интуитивном уровне должно быть ясно, что одна команда
test EAX, EAX
проще и эффективнее, чем две
and eax, 0xFF
test al, al

Тем более, что в первом случае это 2 байта кода, а во втором 7.
Арифметика предельно ясна!"-конец цитаты
7-то никак не выходит. И нельзя ли привести и количество тактов на выполнения каждой команды. Потери по времени скорее всего минимальны, а выигрыш в памяти 3 байта.
Но я не об этом. Обычно булевы флаги передаются в функции как управляющие, а в этом случае, загрука и выгрузка из стека съедят выигрыш по скорости..., если не предпринималь каки-то специальных действий, что обычно не делается. Тк что, в целом, выходит: хрен редьки не слаще...

rivitna опубликован 23-01-2002 00:32 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
2 Vovochka:
Не смеши мои коленки!

Вчера милиция разогнала демонстрацию коммунистов до 75 км/ч, а ты, родной, все тормозишь.

В тактах могу привести только для i486 и то приблизительно
Привожу в машинных кодах, считай:
test eax,eax 85 С0
and eax,0FFh A9 FF 00 00 00 00
test al,al 84 C0

Насчет стека комментировать вообще не хочется комментировать. Специалист ты, круче навозной кучи.
Процессор оптимизирован на работу с базовыми регистрами. В данном случае это 32-разрядные регистры. И по хрену, операции ли со стеком и другие. Если в стек загонять непосредственные значения, то это другой вопрос.

migel опубликован 23-01-2002 13:45 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
дааа уж развели демагогию
насчет стека так там тоже and применяется вовсю -
так как запихивается в стэк не байт а двойное слово то и работа со стэковыми переменными такая же:

mov eax, [esp+bFlag]
and eax, 0FFh
test al, al

rivitna опубликован 23-01-2002 13:57 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
Вот конкретный чувак! Без лишней демагогии правду в матку впендюрил!

А ведь правду глаголит! Но это частности.
А насчет директив асма, родные и не в меру непонятливые мои. Задачей компилятора и является получить эффективный код в машинных кодах, то бишь ассемблер.
С другой стороны, MS - не дураки, ради красивой жизни BOOL не введут.

Student опубликован 23-01-2002 15:50 MSK     Click Here to See the Profile for Student  Click Here to Email Student     
2rivitna: Надо сказать, что эта пауза есть. Особенно она чувствительна на 386 и 486. Можешь даже проверить.
Пишем:

_asm {
...
xor eax,eax
test eax,eax
...
}

а также:
_asm {
...
xor eax,eax
test al,al
...
}

Если второй пример работает также быстро как и первый, то я я тебе ставлю пол-литра...

rivitna опубликован 23-01-2002 16:33 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
2 Student:
Неужели на глаз заметно? :)
Сколько ни писал на асме под DOS и Win32 не замечал такого феномена.

Ты пойми, с памятью еще может быть лишний такт при хитрой адресации, при операциях со стеком, если они следуют друг за другом, но никак с регистрами.
По документации для i486 эти команды требуют по такту вне зависимости от взаимного расположения команд и других условий.

Проверить это весьма сложно, потому что нужны чистые условия эксперимента, я честно не возьмусь это сделать. Да ж за поллитры!

PS: спор в принципе-то глупый, потому как это капля в море неэффективного кода, выдаваемого по объективным причинам компилятором.

Student опубликован 23-01-2002 19:21 MSK     Click Here to See the Profile for Student  Click Here to Email Student     
2rivitna:
Ок, мир и дружба. Я просто протестировал эти кусочки кода в цикле (>100 000 000 проходов) с "секундомером" (GetTickCount()) и оказалось что на AMD XP 1800+ второй пример чуть тормозит, но не так уж и сильно, чтобы терять товарищей по конфе :)
rivitna опубликован 23-01-2002 19:58 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
2 Student:
Мир! Разделим поллитры на двоих. Я тоже дорожу хорошими отношениями :)))
Valery опубликован 23-01-2002 23:21 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
а вот вам хохма, камешек в огород BOOL:

BOOL func1 (int choice)
{
return (choice == 1)? 1000 : 0;
}

bool func2 (int choice)
{
return (choice == 1)? 1000 : 0;
}

int main(int argc, char *argv[])
{
cout << (FALSE == func1(1)) << endl;
cout << (FALSE == func1(2)) << endl;
cout << (TRUE == func1(1)) << endl; // surprise!!!
cout << (TRUE == func1(2)) << endl;

cout << (false == func2(1)) << endl;
cout << (false == func2(2)) << endl;
cout << (true == func2(1)) << endl;
cout << (true == func2(2)) << endl;
}

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

rivitna опубликован 24-01-2002 07:23 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
2 Valery:
Есть у меня один знакомый чайник, который решил изучить команды ДОС, он их вводил на компьютере, так скать тренировался. В один прекрасный день он дошел до "FORMAT", на примере в книжке "format c:" его ждало разочарование... Мне стало обидно за беднягу, все спасли, конечно, но теперь он идейный борец против команды "format"...

Кстати, в MSDN к некоторым функциям API добавлено замечание: что возвращаемое значение TRUE не всегда 1. Что теперь делать, чтобы спасти новичков, ума не приложу. Может напишем, Valery, консолидированную просьбу в MS?

Valery опубликован 24-01-2002 08:09 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
2rivitna:
меня можешь не причислять к новичкам.
бороться против BOOL я не собираюсь. но уж если ms не всегда хотят возвращать 1/0 то могли бы и не называть тип логическим, нормальные программисты точно так же спокойно бы относились к возвращаемому инту, зная что он спокойно проверяется в логических выражениях.
на меня наезды Ваши, сэр, безпочвенны.
migel опубликован 24-01-2002 10:52 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
"Всемирное братание, как всегда, закончилось наездом..."
Топик, пожалуй, закрывать можно. а то передеретсь еще... :-)
rivitna опубликован 24-01-2002 11:05 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
2 Valery:
Обидели мышку, нагадили в норку! :)))
Извини, что задел твою ранимую душу. Поверь, не хотел.

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

Не восприми, как наезд. Не обижайся за отсутствие пиетета перед докой. :)
С уважением!

PS: Объявляю мараторий на участие в этом топике. Можете мне гадости писать, я щеку в другом топике подставлю :)

Valery опубликован 24-01-2002 11:38 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
да ладно, мне тоже пофигу....
прошу только заметить, что первоначально я не наезжал ни на кого адресно.
Valery опубликован 24-01-2002 11:48 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
2migel:
совсем не в продолжение флейма, а очень даже по теме. мне так кажется, что меньшее быстродействие bool может быть обосновано еще и тем, что (как я уже показал на гипотетическом примере) такое поведение должно что-то кушать еще и в самой функции, которая возвращает значение, т.е. когда мы говорим return 1000; происходит преобразование к 1 (true). хоть пара команд да и должна быть для этого. так что факторов большего быстродействия будет уже 2 по крайней мере.
А уж пользоваться тем или другим дело личных предпочтений.
SUnteXx опубликован 25-01-2002 00:30 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
Вот еще пример:

BOOL b = (BOOL)SendMessage(hWnd, WM_GETTEXTLENGTH, 0l, 0l); // У меня возвратилось 80
bool b1 = (bool)SendMessage(hWnd, WM_GETTEXTLENGTH, 0l, 0l); // А здесь 1!

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.