|
||||
|
Оптимизировать или нет? Оптимизация - не панацея, и ее применение не бесплатно. В зависимости от степени оптимизации время, требуемое для компиляции программы, может значительно возрастать. Для небольших программ требуемое время можно не принимать во внимание, но для больших оно может иметь значение. Оптимизация также может усложнить отладку вследствие генерации кода, который трудно непосредственно связать с исходными операторами в программе. Оптимизация может неожиданно ввести ошибки в код, сгенерированный из вполне правильного текста программы. Ситуация, когда на переменную ссылаются как непосредственно по имени, так и посредством одного или нескольких указателей, может затруднить работу компилятора по определению того, "жива" ли еще переменная и, следовательно, должна оставаться в регистре, или она "умерла" и тогда должна быть сохранена в памяти. Вынесение инвариантного кода может быть потенциальным источником ошибок. В цикле int a[10], x, y; for(i = 0; i < 10; i++) if( y != 0 ) a[i] = x / y; оптимизирующий компилятор может определить, что выражение x/y есть инвариант, и вынесет его за пределы цикла, игнорируя проверку на 0 и создавая возможность возникновения ситуации деления на 0. Когда компилятор выполняет удаление переменных индукции цикла он может непреднамеренно породить ситуацию переполнения, потому что он может переструктурировать вычисления, включающие индексы цикла. В приведенном ранее примере, где выполняется оптимизация, используя вынесение инвариантного кода и удаление переменных индукции цикла, переменная индукции i была извлечена, в результате имеем: T1 = j + k; for(x = 0; x < T1 * v; x += T1); В этом случае, поскольку значения j, k и v неизвестны, существует возможность переполнения для выражения T1 * v. Цикл может не закончиться. |
|
||