debi12345 писал(а):хотя занимает совсем мало инструкций. Но на молочении даже это "совсем мало" заметно.
зато тут есть лишняя команда сравнения
- Код: Выделить всё
cmpl $-1,%esi
А вообще это здесь оффтоп, я думаю.
Модератор: Модераторы
debi12345 писал(а):хотя занимает совсем мало инструкций. Но на молочении даже это "совсем мало" заметно.
cmpl $-1,%esi
А вообще это здесь оффтоп, я думаю.
Mikhail писал(а):Алексей, умоляю, больше не пишите мне.
debi12345 писал(а):Оценка цены проверки диапазона если таковую реализовать в рантайме для типов вроде "integer from 0 to 10" или integer{5}. Если задаешь точный диапазон, то подразумевается что будешь его проверять не только на этапе компиляции
Мне кажется, что оценка на вхождение в диапазон, как на этапе компиляции, так в runtime, если и нужна, то очень и очень редко.
type
thebooleantype = $ff; //8bit
thecardinaltype = $00000000..$ffffffff; //32bit
theintegertype = -$8000..$7fff; //16 bit
thecharactertype = #$00..#$ff; //8bit
thenotbyteboundarytype = $0..$f;
//4bit if bitpacked, 8bit otherwise, helpful as bitfields in controllerregisters for
// bitpacked records
thesubrangetype = 5..10; //4bit if bitpacked, 8bit otherwise
unit systypes;
type
//same on all architectures
bool1= $1; //1bit
bool8= $ff;
bool16= $ffff;
bool32= $ffffffff;
card8 = $00..$ff;
card16 = $0000..$ffff;
card32 = $00000000..$ffffffff;
card64 = $0000000000000000..$ffffffffffffffff;
int8 = -$80..$70;
int16 = -$8000..$7fff;
int32 = -$80000000..$7fffffff;
int64 = -$8000000000000000..$7fffffffffffffff;
char8 = #$00..#$ff;
char16 = #$0000..#$ffff;
char32 = #$00000000..#$ffffffff:
//achitecture dependent, there can be more diferentation for
//different operating systems
//boolean, cardinal and integer are the "recommended" types
//card and int have the size of the CPU registers
boolean = bool8;
{$if REGISTERSIZE = 16}
cardinal = card16;
integer = int16;
card = card16;
int = int16;
{$else}
cardinal = card32;
integer = int32;
{$endif}
{$if REGISTERSIZE = 32}
card = card32;
int = int32;
{$else}
{$if REGISTERSIZE = 64}
card = card64;
int = int64;
{$endif}
{$endif}
debi12345 писал(а): Если задаешь точный диапазон, то подразумевается что будешь его проверять не только на этапе компиляции
if (xmin <= x) and (xmax >= x) then...
Собственно переполнение контролируется только для целых равных размеру регистра
jno <label>; // если нет переполнения операнда то продолжать на эту метку
call FPC_OVERFLOW; // сгенерировать исключение по переполнению
if (i2 > -1) and (i2 < 100000000) then
movl %ebx,%eax
cmpl $-1,%eax
jng .Lj53
cmpl $100000000,%eax
jnl .Lj53
movzbl %bl,%eax; // приведение типа int8->int32
movsbl %bl,%eax; // приведение типа int16->int32
movl %ebx,%eax; // int32->int32 без приведения
debi12345 писал(а):Не автоматом, а на каждом доступе к контроллируемым переменным вызывается специнструкция JNO (ловящая флаг CPU о переполнении) :
xor eax, eax
mov al, [x]
add ebx //второй операнд в ebx
debi12345 писал(а):Кстати, с этими приведениями типов контроль диапазона входных переменных на рантайме не работает, контроллируется только результат математических операций. Хмм..
var x:1..100;
readln(a);
проверка для них, по сути, эквивалентна "ручной" проверке.
Если я введу 101 ошибки не будет?
//achitecture dependent, there can be more diferentation for
//different operating systems
integer as TINY; // shortest for arch (current "byte")
integer as COMPACT; // smth like current int16
integer as FASTEST; // smth like current int32
integer as BIG; // smth like current int64
integer as HUGE; // maximal emulated size
debi12345 писал(а):Это значит что "широкая" типизация вроде "INTEGER FROM <min> [TO <max>]" имеет смысл (проверка диапазона только на этапе компиляции - как происходит сейчас), так как не приведет к падению перформанса в ран-тайме относительно нынешней реализации.
debi12345 писал(а):Чтобы ловила на ран-тайме - нужно вставлять (опциональный) код проверки - он слегка замедлит прогу. Можно придумать спецфлаг для переменных, управляющий рантайм-проверками.
Ну сгенирируется исключение, и что с ним делать
debi12345 писал(а):Выносить код проверки и обработки в отдельное от рабочего кода место - очень удобно, во многом поэтому пипл обожает исключения
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2