Форум: "Основная";
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];
ВнизЗначение 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c