Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Значение BOOLEAN по умолчанию


Андрей Сенченко ©   (2002-02-11 16:34:00) 

Заметил, что
var
a,b : boolean;
begin
// Если здесь проверить состояние a и b, то они оказываются false.
end.

Стало интересно: всегда ли это так и есть ли тому объяснения ?


Digitman (M)   (2002-02-12 13:04:00) [1]

Да, значит. Достаточно указать правильное соглашение о вызове, а уж компилятор с оптимизатором сами разберутся, как реально и без потерь производительности (связанных с выравниванием) передать параметр типа Boolean. Исключением. првда, можно считать ситуации, когда вызываемый код не поддерживает напрямую булев тип (например, BLR-интерпретатор в IB-сервере) и интерпретация совместимых типов (например, smallint, integer) как булев тип возлагается на прикладную часть логики вызываемого кода (в случае с тем же IB - тело SP/триггера/View)

В случае использования, к примеру, array[..] of bytebool оптимизатор будет заботиться лишь о выравнивании массива на границу DWORD, нисколько не заботясь при этом об эффективности потенциальных обращений к элементам такого массива в run-time - сие уже отдается на откуп программеру. То же самое - о packed record


PVOzerski   (2002-02-12 12:44:00) [2]

Значит ли это, что в случае передачи параметров использование boolean ничем не хуже, чем longbool,
а реальная потеря качества оптимизации здесь возникает только в случаях массивов и packed record?
Или и там "тормозов" не возникает?


Digitman (M)   (2002-02-12 11:50:00) [3]

>PVOzerski
В Win32 в режиме PM в стек ВСЕГДА помещается DWORD !
Режим же виртуальной DOS-машины, думаю, мы здесь не рассматриваем, но и в этом режиме в стек помещается как минимум WORD


PVOzerski   (2002-02-12 10:55:00) [4]

2drpass:
Это Вы правильно говорите, но я ведь не об этом спрашиваю, а о выравнивании


drpass   (2002-02-12 10:45:00) [5]

У boolean значения 0=false и 1=true (для совместимости с классическим Паскалем). В false он инициализируется автоматически конструктором класса и компилятором при запуске программы. Остальные типы данных (bytebool, longbool...) имеют 0=false и -1=true (для совместимости с Сями и т.д.)


PVOzerski   (2002-02-12 10:33:00) [6]

В связи с изложенным, смежный вопрос: а что лучше использовать, если есть выбор:
boolean или longbool? Вроде бы компиляторы D2-6 32-разрядные, естественна работа с
longbool, но в исходниках VCL везде boolean. И ладно, когда boolean - возвращаемое значение
функции (положил в EAX longbool, вынул из AL boolean), но ведь и в стек 1-байтовый boolean-
параметр кладут. Почему так (для сравнения: в Си для 32-разрядных платформ BOOL 32-битный)?


Palmik   (2002-02-12 06:02:00) [7]

Кааароче по умолчанию- все BOOLEANустановлены как - FALSE!!!
И все тут :)))))
Серьезно.


Иван Шихалев   (2002-02-11 20:36:00) [8]

Понятно. Не знал...


Digitman   (2002-02-11 18:22:00) [9]

Туда. Но компилятор вставляет неявный код инициализации BSS


Иван Шихалев   (2002-02-11 16:52:00) [10]

А разве они не в сегмент неинициализированных помещаются? BSS.


Digitman   (2002-02-11 16:48:00) [11]

>Иван Шихалев
"Обнулением" будущих статических переменных заниматся компилятор.


Иван Шихалев   (2002-02-11 16:46:00) [12]

Вот это синхронность! :)


Иван Шихалев   (2002-02-11 16:44:00) [13]

Если a и b - глобальные переменные, то да. Хотя это и необязательно, но ОС, AFAIK, прошивает неинициализированные переменные нулями. А вот если это локальные переменные функции или процедуры, то это не так - что осталось в стеке, то и будет.


Юрий Зотов   (2002-02-11 16:43:00) [14]

По определению, false - это ноль, true - это все остальное (а практически - единица).

Если переменные глобальные, компилятор инициализирует их нулями, если локальные - то они нули только до первого вызова процедуры.

Выводы очевидны.


Pete   (2002-02-11 16:42:00) [15]

По-моему все переменные по умолчанию равны 0. Стало быть false=0, true=1.

вроде бы можно сделать так:
a:boolean = true;


Наверх

Титульная страница Поиск, карта сайта Написать письмо