![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Значение 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;