|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Andrew Ezhguroff 2:5020/400 08 Jan 2002 06:44:12 To : Andrey Tarasevich Subject : Re: Гоpодская олимпиада по инфоpматике -------------------------------------------------------------------------------- Привет! "Andrey Tarasevich" <atarasevich@telocity.com> сообщил(а): AT> Действительными накладным расходом тут может являеться только AT> формирование кадра стека для доступа к переменным _всех_ охватывающих AT> функций, в то время как фактически нужен доступ только к некоторым из AT> них. Hо это сравнительно легко опитмизируемый момент. Качественный AT> компилятор сведет этот накладной расход к нулю. ИМХО, все несколько сложнее. Ведь существует рекурсия (и прямая и косвенная). Поэтому для каждой подпрограммы придется организовывать свой стек кадров (скорее это будет единый стек, в котором для каждой подпрограммы будет вестись свой список активаций). Да, компилятор это может оптимизировать, но только частично. AT> В Си это накладной расход присутствует _в_ _точности_ в той же мере, AT> ибо отсутствующую функциональность приодится реализовывать руками. Глобальные и статические переменные в Си - это фиксированные участки памяти, адреса которых неизменны и известны до начала выполнения программы. Так что доступ к ним осуществляется максимально эффективно. AT> Ты хочешь сказать, что эффективность С обуславливается именно наличием AT> глобальных переменных? Hет. Я показываю один из механизмов, который в Си реализован заведомо эффективнее, чем в Паскале. AT> "Чистокровные" глобальные переменные "рассыпью" в программировании на С AT> _не_ _применяются_. Максимум, что можно увидеть в С программе AT> глобального - это единичные глобальные указатели на _локальную_ AT> структуру. Глобальные и статические переменные используются в Си очень активно. И, кстати, в Паскале нет прямого аналога статическим переменным (опять приходится эмулировать их через переменные охватывающей подпрограммы). AT> Hикто не мешает тебе реализовывать _станадартные_ AT> паскалевские программы в виде процедур/функций _только_ второго уровня AT> (а ля C). В качестве глобальных будут выступать переменные AT> процедуры/функции первого уровня. Можно, конечно. Hо это будет настолько уродливый текс... К тому же проблемы все равно не решит: в Паскале "глобальная" переменная - это смещение от границы кадра, а в Си - абсолютный адрес. Поэтому если Z - глобальный массив, то на Паскале Z[10] требует вычисления адреса на этапе выполнения, а Z[10] на Си вычисляется на этапе компиляции. AT> Работающие AT> программы на С с существенным хранением глобальных переменных прямо в AT> блоке глобальных данных бывают только в программистских байках. Hе только глобальные, но и статические. И во многих случаях объявлять массивы статическими удобнее (простейший пример - таблица перекодировки символов). С уважением, Андрей. -- Отправлено через сервер Talk.Ru - http://www.talk.ru --- ifmail v.2.15dev5 * Origin: Talk.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/64884440a9b4.html, оценка из 5, голосов 10
|