![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
читаю "Основные концепции языков программирования", 4ю главу, где Страуструп про переменные пишет. Я так понял, статическое связывание было придумано только для ускорения компилирования и быстрой работы программ, где есть такие переменные. Но имеет ли смысл понимание и использование соответствующих типов связывания сейчас, когда настольные ПК (а тем более серваки) обладают гораздо большими скоростными возможностями? Для мобильных устройст, систем реального времени и прочих малоресурсных систем - смысл есть. Для ПК - преимущества static кажется призрачным, имхо.
|
|||
|
||||
| cutwater |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
Имеется ввиду раннее и позднее либо как называют статическое и динамическое.
Вы ответьте на вопрос, при современных технологиях на велосипед можно навесить реактивный двигатель, так стоит ли отказываться от велосипеда. Раннее связывание происходит на этапе компиляции и переносить его в рантайм смысла не имеет. Зачем? Позднее связывание имеет место только для виртуальных методов, когда в процессе исполнения заполняется vtable. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Статическое связывание переменной с типом позволяет провести полную проверку на соблюдение типобезопасности на этапе компиляции. Т.е после проверки компилятором можно быть увереным, что по этой части нарушений нет. При динамическом связывание вся проверка переносится в рантайм, а ошибка может долгое время не проявляться ( пока программа не выполнит ту строчку кода), к тому же определить в чем именно трабла достаточно сложно. |
|||
|
||||
| Gunslinger |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Эти преимущества static я знаю. Меня интересует другое его преимущество - скорость работы программы, когда в место динамических переменных используются статические (естественно, где нет списков и прочих меняющихся структур). Добавлено через 3 минуты и 9 секунд
что это? Ничего об этом не знаю. Думал обычный двоичный код, который процессор берет, обрабатывает и кладет обратно. Только один код программы. Что проводит такие проверки? |
||||
|
|||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
для обычных программ это преимущество несущественное.
вот этот код и берет переменную, определяет ее тип и в зависимости от типа выбирает нужную реализацию функции для текущей задачи. Например Вам нужно инкрементировать n-j элемент массива . mas [n] = mas[n]+1; а где то выше идет такое : n=1.34523; mas = 2; при строгой статической проверке типов компилятор завопит.. А как должна поступить программа при динамическом связывании типов если у нее нет проверки ?
в той главе описываются не статические и динамические переменные, а статическое и динамическое связывание типов.. Это сообщение отредактировал(а) mes - 11.8.2008, 12:15 |
||||||
|
|||||||
| cutwater |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
Автору читать полиморфизм и механизм полиморфизма.
|
|||
|
||||
| Gunslinger |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Лабораторные? А игры и моделирование-визуализация?
я надеюсь смысл вопроса от этого не потерян? Как я понял, связывание типов - это выделение компилятором памяти либо до выполнения программы (при компиляции), либо во время выполнения.
т.е. компилятор к коду самой программы (инструкции, функции и прочее написанное программистом) добавляет что-то вроде служебной информации - в данном случае проверки типов? Добавлено через 3 минуты и 34 секунды теоретически имею предтавление. на практике реализовывал в виде перегрузки функций. а здесь это что значит? |
||||
|
|||||
| cutwater |
|
||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
Ты понял не правильно. Это не выделение памяти в стеке или в куче. На этапе компиляции вся информация о типе без виртуальных ф-ций известна. Если в классе есть хотя бы один виртуальный метод, то создается vptr и vtable, vtable (виртуальная таблица адресов) хранит в себе адреса виртуальных функций и создается во время создания объекта в рантайм.
Это сказывается на быстродействии и на безопасности типов. Пример
Случай 1
тут и так все понятно вывод
Случай 2
а вот тут неожиданность. результат
компилятору не известно о том что foo перегружен в дочернем классе, поэтому будет вызван метод базового класса. но если в базовом классе объявить метод foo виртуальным, то во время создания объекта дочернего класса в виртуальной таблице адрессов методу foo будет соответствовать адрес перегруженного метода.
Собственно я попытался в 2х словах объяснить механизм работы. ЕМНИП Как раз последний пример и относится к позднему связыванию Это сообщение отредактировал(а) cutwater - 11.8.2008, 16:59 |
||||||||||||
|
|||||||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вопрос как я понимаю был этот : 1 Понимание программисту всегда необходимо.. Он должен точно представлять что делает. При том что разница далеко не в скорости выполнения 2 Использование обуславливается в первую очередь выбором языка. Да сегодняшние компьютеры настолько мощны, что для решения большинства бытовых задач можно безбоязненено в плане скорости использовать язык с динамическим связыванием типов. в узких местах такие как вывод на экран, например для 3д графики или шейдеров используются специальные библиотеки , которые экономят скорость на всем включая также и статическое связывание типов. |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
да, так. и все таки ?
К вопросу о том, какую инфу добавляет компилятор к исходнику - спасибо, интересно было узнать. Но я так и не понял про связывание типов. Те примеры, которые ты привел - это демонстрация полиморфизма. Уточню еще раз: статическое связывание типов - переменная объявлена (выделен размер = типу) и инициализирована (присвоено значение). до конца работы программы ее значение не изменится. проводится при компиляции. динамическое связывание типов - переменная объявлена (выделен размер = типу), но не инициализирована. инициализация (запись значения) происходит во время работы программы. ps больше ничего не приводит. |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
статическое связывание типа - это такой метод работы с ячейкой пямяти , когда тип хранимого там значения известен на момент компиляции и не может быть изменен в процессе выполнения проги. динамическое связывание - это такой метод работы с ячейкой пямяти , когда тип хранимого там значения неизвестен (или не проверяется) на этапе компиляции, а становится известен (и зачастую может быть изменен) только в процесе выполнения. Для обеспечения такой возможности выделяется дополнительная память под хранения типа. Виртуальные функции в с++ имеют ограниченное динамическое связывание. именно так.. При каждом вызове функции выбирается та которая больше подходит для текушего типа. В случае ненахождения и конфликта возникает ошибка. При статическом возникает в момент компиляции, при динамическом в момент выполнения.. Способы проверки и реакции на ошибку зависят от конретного языка и компилятора. Хочу также отметить что виртуальные функции в данном контексте обладают статическим связыванием, и не позволяют сделать перегрузку по их динамическому типу. Для обхода этого ограничения используют двойную диспетчеризацию, которая предоставляет перегрузку по динамическому типу, сохраняя проверку типов на этапе компиляции.. не понял относительно своего первого вопроса ? |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Отчасти ведь auto и decltype в С++0х будут связаны с вопросом связывания. И хотя в техническом плане связывание так же будет происходить в compile-time, для программиста это будет смотрется немного иначе, ведь явно указывать тип не понадобится, хотя необходимо знать, что где-то он уже указан.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Gunslinger |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
попутал да. вопрос решен - это был чисто обывательский интерес. Просто сейчас пошел уже не обывательский. К теме топика уже мало отношения имеет, если модератор закроет тему - создам отдельную. Недопонимаю. Уточняющие вопросы:
1. тип же всегда известен, в с++ только так переменные и объявляются. Или может быть иначе? 2. Как тип переменной может быть изменен в процессе выполнения? Имеется ввиду преведение типов? 3. Под статическим связыванием типов я понимаю следующее: int y=2; - тип известен, компилятор выделяет под него память размером int (до выполнения, при компиляции). значение тоже известно - компилятор записывает его в ячейку int y. 4. Создает ли компилятор доп инфу, как в случае с виртуальными функциями для объявленных переменных, но не инициализированных? int x; или int *p=new int[]; Добавлено через 10 минут и 47 секунд
имею ввиду соответствие название_переменной=адрес |
||||
|
|||||
| Partizan |
|
||||||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
компилятор только компилирует....никакой памяти он "до выполнения, при компиляции" не выделяет...
Вам думаете, что int x; - это позднее связывание? -------------------- СУВ, Partizan. |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |