Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.02.28;
Скачать: CL | DM;

Вниз

Значение BOOLEAN по умолчанию   Найти похожие ветки 

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

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

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


 
Pete ©   (2002-02-11 16:42) [1]

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

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


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

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

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

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


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

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


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

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


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

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


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

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


 
Digitman ©   (2002-02-11 18:22) [7]

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


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

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


 
Palmik ©   (2002-02-12 06:02) [9]

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


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

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


 
drpass ©   (2002-02-12 10:45) [11]

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


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

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


 
Digitman (M) ©   (2002-02-12 11:50) [13]

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


 
PVOzerski ©   (2002-02-12 12:44) [14]

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


 
Digitman (M) ©   (2002-02-12 13:04) [15]

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

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



Страницы: 1 вся ветка

Текущий архив: 2002.02.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
3-90518
СергейМНК
2002-02-04 06:15
2002.02.28
Как сделать чтобы выскакивал LoockUp список при начале набора текста в DBGrid в LoockUp поле


14-90667
Lamok(real)
2002-01-10 15:07
2002.02.28
Сколько денег затребовать ?


3-90512
tow
2002-02-04 10:50
2002.02.28
Базы данных


1-90621
Lotus
2002-02-13 08:48
2002.02.28
вопрос спецам по TMemo


14-90634
ТеньЛуны
2002-01-12 14:54
2002.02.28
Народ! А в последней аське актив лист убрали шоль????