Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> статическое и динамическое связывание, имеет ли смысл при современных скоростях 
:(
    Опции темы
Gunslinger
Дата 11.8.2008, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



читаю "Основные концепции языков программирования", 4ю главу, где Страуструп про переменные пишет. Я так понял, статическое связывание было придумано только для ускорения компилирования и быстрой работы программ, где есть такие переменные. Но имеет ли смысл понимание и использование соответствующих типов связывания сейчас, когда настольные ПК (а тем более серваки) обладают гораздо большими скоростными возможностями? Для мобильных устройст, систем реального времени и прочих малоресурсных систем - смысл есть. Для ПК - преимущества static кажется призрачным, имхо.
PM MAIL   Вверх
cutwater
Дата 11.8.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Имеется ввиду раннее и позднее либо как называют статическое и динамическое.
Вы ответьте на вопрос, при современных технологиях на велосипед можно навесить реактивный двигатель, так стоит ли отказываться от велосипеда.

Раннее связывание происходит на этапе компиляции и переносить его в рантайм смысла не имеет. Зачем?
Позднее связывание имеет место только для виртуальных методов, когда в процессе исполнения заполняется vtable.


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 11.8.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  11.8.2008,  10:56 Найти цитируемый пост)
Я так понял, статическое связывание было придумано только для ускорения компилирования и быстрой работы программ, где есть такие переменные.


Статическое связывание переменной с типом позволяет провести полную проверку на соблюдение типобезопасности на этапе компиляции.
Т.е после проверки компилятором можно быть увереным, что по  этой части нарушений нет. 
При динамическом связывание вся проверка переносится в рантайм, а ошибка может  долгое  время не проявляться ( пока программа не выполнит ту строчку кода), к тому же определить в чем именно трабла достаточно сложно. 




--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 11.8.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @ 11.8.2008,  11:35)
Статическое связывание переменной с типом позволяет провести полную проверку на соблюдение типобезопасности на этапе компиляции.
Т.е после проверки компилятором можно быть увереным, что по  этой части нарушений нет. 
При динамическом связывание вся проверка переносится в рантайм, а ошибка может  долгое  время не проявляться ( пока программа не выполнит ту строчку кода), к тому же определить в чем именно трабла достаточно сложно.

Эти преимущества static я знаю. Меня интересует другое его преимущество - скорость работы программы, когда в место динамических переменных используются статические (естественно, где нет списков и прочих меняющихся структур).

Добавлено через 3 минуты и 9 секунд
Цитата(mes @ 11.8.2008,  11:35)
При динамическом связывание вся проверка переносится в рантайм, а ошибка может  долгое  время не проявляться ( пока программа не выполнит ту строчку кода), к тому же определить в чем именно трабла достаточно сложно.

что это? Ничего об этом не знаю. Думал обычный двоичный код, который процессор берет, обрабатывает и кладет обратно. Только один код программы. Что проводит такие проверки?
PM MAIL   Вверх
mes
Дата 11.8.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  11.8.2008,  11:48 Найти цитируемый пост)
Меня интересует другое его преимущество - скорость работы программы

для обычных программ это преимущество несущественное.



Цитата(Gunslinger @  11.8.2008,  11:48 Найти цитируемый пост)
Думал обычный двоичный код, который процессор берет, обрабатывает и кладет обратно. Только один код программы. Что проводит такие проверки? 

вот этот код и берет переменную, определяет ее тип и в зависимости от типа выбирает нужную реализацию функции для текущей задачи.
Например Вам нужно инкрементировать n-j элемент массива . mas [n] = mas[n]+1;  
а где то выше идет такое : n=1.34523;  mas = 2; 
при строгой статической проверке типов компилятор завопит..
А как должна поступить программа при динамическом связывании типов если у нее нет проверки ?  smile

Цитата(Gunslinger @  11.8.2008,  11:48 Найти цитируемый пост)
когда в место динамических переменных используются статические

в той главе описываются не статические и динамические переменные, а статическое и динамическое связывание типов.. smile 

Это сообщение отредактировал(а) mes - 11.8.2008, 12:15


--------------------
PM MAIL WWW   Вверх
cutwater
Дата 11.8.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Автору читать полиморфизм и механизм полиморфизма. 


--------------------
user posted image
PM MAIL   Вверх
Gunslinger
Дата 11.8.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @  11.8.2008,  12:14 Найти цитируемый пост)
для обычных программ 

Лабораторные? А игры и моделирование-визуализация?

Цитата(mes @  11.8.2008,  12:14 Найти цитируемый пост)
в той главе описываются не статические и динамические переменные, а статическое и динамическое связывание типов.. 

я надеюсь смысл вопроса от этого не потерян? Как я понял, связывание типов - это выделение компилятором памяти либо до выполнения программы (при компиляции), либо во время выполнения. 




Цитата(mes @  11.8.2008,  12:14 Найти цитируемый пост)
вот этот код и берет переменную, определяет ее тип и в зависимости от типа выбирает нужную реализацию функции для текущей задачи.

т.е. компилятор к коду самой программы (инструкции, функции и прочее написанное программистом) добавляет что-то вроде служебной информации - в данном случае проверки типов?

Добавлено через 3 минуты и 34 секунды
Цитата(cutwater @  11.8.2008,  12:36 Найти цитируемый пост)
Автору читать полиморфизм и механизм полиморфизма.

теоретически имею предтавление. на практике реализовывал в виде перегрузки функций. а здесь это что значит?
PM MAIL   Вверх
cutwater
Дата 11.8.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Ты понял не правильно. Это не выделение памяти в стеке или в куче. На этапе компиляции вся информация о типе без виртуальных ф-ций известна. Если в классе есть хотя бы один виртуальный метод, то создается vptr и vtable, vtable (виртуальная таблица адресов) хранит в себе адреса виртуальных функций и создается во время создания объекта в рантайм.
Это сказывается на быстродействии и на безопасности типов.

Пример
Код

class Base
{
public:
void foo(){cout<<"Base"<<endl;}
}

class Derived : public Bases
{
public:
void foo(){cout<<"Derived"<<endl}
}


Случай 1
Код

Base baseObj;
Derived derivedObj;

baseObj.foo();
derivedObj.foo();

тут и так все понятно
вывод
Код

Base
Derived

Случай 2
Код

Base * pObj = new Derived();

pObj->foo();

а вот тут неожиданность. результат
Код

Base

компилятору не известно о том что foo перегружен в дочернем классе, поэтому будет вызван метод базового класса.
но если в базовом классе объявить метод foo виртуальным, то во время создания объекта дочернего класса в виртуальной таблице адрессов методу foo будет соответствовать адрес перегруженного метода.
Код

class Base
{
public:
virtual void foo(){cout<<"Base"<<endl;}
}

Собственно я попытался в 2х словах объяснить механизм работы. ЕМНИП Как раз последний пример и относится к позднему связыванию

Это сообщение отредактировал(а) cutwater - 11.8.2008, 16:59


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 11.8.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  11.8.2008,  16:31 Найти цитируемый пост)
я надеюсь смысл вопроса от этого не потерян? 

вопрос как я понимаю был этот :
Цитата(Gunslinger @  11.8.2008,  10:56 Найти цитируемый пост)
Но имеет ли смысл понимание и использование соответствующих типов связывания сейчас, когда настольные ПК (а тем более серваки) обладают гораздо большими скоростными возможностями? 

1 Понимание программисту всегда необходимо.. Он должен точно представлять что делает. При том что разница далеко не в скорости выполнения smile
2 Использование обуславливается в первую очередь выбором языка. 
Да сегодняшние компьютеры настолько мощны, что для решения большинства  бытовых задач можно безбоязненено в плане скорости использовать язык с динамическим связыванием типов. 

Цитата(Gunslinger @  11.8.2008,  16:31 Найти цитируемый пост)
Лабораторные? А игры и моделирование-визуализация?

в узких местах такие как вывод на экран, например для 3д графики или шейдеров  используются специальные библиотеки , 
которые экономят скорость на всем включая также и статическое связывание типов.  



--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 11.8.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @  11.8.2008,  17:35 Найти цитируемый пост)
вопрос как я понимаю был этот :

да, так.

и все таки
Цитата(Gunslinger @  11.8.2008,  16:31 Найти цитируемый пост)
т.е. компилятор к коду самой программы (инструкции, функции и прочее написанное программистом) добавляет что-то вроде служебной информации - в данном случае проверки типов?
?

Цитата(cutwater @  11.8.2008,  16:54 Найти цитируемый пост)
то создается vptr и vtable, vtable (виртуальная таблица адресов) хранит в себе адреса виртуальных функций и создается во время создания объекта в рантайм.

К вопросу о том, какую инфу добавляет компилятор к исходнику - спасибо, интересно было узнать.
Но я так и не понял про связывание типов. Те примеры, которые ты привел - это демонстрация полиморфизма.

Уточню еще раз:
статическое связывание типов - переменная объявлена (выделен размер = типу) и инициализирована (присвоено значение). до конца работы программы ее значение не изменится. проводится при компиляции.
динамическое связывание типов - переменная объявлена (выделен размер = типу), но не инициализирована. инициализация (запись значения) происходит во время работы программы.

ps больше ничего не приводит.
PM MAIL   Вверх
Alek86
Дата 11.8.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Gunslinger @  11.8.2008,  18:20 Найти цитируемый пост)
до конца работы программы ее значение не изменится.

это называется "константа"


Цитата(Gunslinger @  11.8.2008,  18:20 Найти цитируемый пост)
динамическое связывание типов - переменная объявлена (выделен размер = типу), но не инициализирована. инициализация (запись значения) происходит во время работы программы.


заметь, после тире у тебя - ни слова о типе


--------------------
user posted image    user posted image
PM MAIL   Вверх
mes
Дата 11.8.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  11.8.2008,  18:20 Найти цитируемый пост)
Уточню еще раз:
статическое связывание типов - переменная объявлена (выделен размер = типу) и инициализирована (присвоено значение). до конца работы программы ее значение не изменится. проводится при компиляции.
динамическое связывание типов - переменная объявлена (выделен размер = типу), но не инициализирована. инициализация (запись значения) происходит во время работы программы.


статическое связывание типа  - это такой метод работы с ячейкой пямяти , когда тип хранимого там значения известен на момент компиляции и не может быть изменен в процессе выполнения проги. 
динамическое связывание  - это такой метод работы с ячейкой пямяти , когда тип хранимого там значения неизвестен (или не проверяется) на этапе компиляции, а становится известен (и зачастую может быть изменен) только в процесе выполнения. Для обеспечения такой возможности выделяется дополнительная память под хранения типа. 
Виртуальные функции в с++ имеют ограниченное динамическое связывание. 

Цитата(Gunslinger @  11.8.2008,  18:20 Найти цитируемый пост)
т.е. компилятор к коду самой программы (инструкции, функции и прочее написанное программистом) добавляет что-то вроде служебной информации - в данном случае проверки типов?

именно так.. При каждом вызове функции выбирается та которая больше подходит для текушего типа. В случае ненахождения и конфликта возникает ошибка. При статическом возникает в момент компиляции, при динамическом в момент выполнения.. Способы проверки и реакции на ошибку зависят от конретного языка и компилятора. 
Хочу также отметить что виртуальные функции в данном контексте обладают статическим связыванием, и не позволяют сделать перегрузку по их динамическому типу.  Для обхода этого ограничения используют двойную диспетчеризацию, которая предоставляет перегрузку по динамическому типу, сохраняя проверку типов на этапе компиляции..  smile 

Цитата(Gunslinger @  11.8.2008,  18:20 Найти цитируемый пост)
Но я так и не понял про связывание типов. 

не понял относительно своего первого вопроса ?  smile 



--------------------
PM MAIL WWW   Вверх
W4FhLF
Дата 11.8.2008, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Отчасти ведь auto и decltype в С++0х будут связаны с вопросом связывания. И хотя в техническом плане связывание так же будет происходить в compile-time, для программиста это будет смотрется немного иначе, ведь явно указывать тип не понадобится, хотя необходимо знать, что где-то он уже указан. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Gunslinger
Дата 12.8.2008, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(Alek86 @  11.8.2008,  18:35 Найти цитируемый пост)
это называется "константа"

попутал да.


Цитата(Alek86 @  11.8.2008,  18:35 Найти цитируемый пост)
заметь, после тире у тебя - ни слова о типе


Цитата(mes @  11.8.2008,  19:15 Найти цитируемый пост)
не понял относительно своего первого вопроса ?

вопрос решен - это был чисто обывательский интерес. Просто сейчас пошел уже не обывательский. К теме топика уже мало отношения имеет, если модератор закроет тему - создам отдельную.


Цитата(mes @  11.8.2008,  19:15 Найти цитируемый пост)
статическое связывание типа  - это такой метод работы с ячейкой пямяти , когда тип хранимого там значения известен на момент компиляции и не может быть изменен в процессе выполнения проги. 

Недопонимаю. Уточняющие вопросы:
    
Код

        int x;
        int y=2;
    

1. тип же всегда известен, в с++ только так переменные и объявляются. Или может быть иначе? 
2. Как тип переменной может быть изменен в процессе выполнения? Имеется ввиду преведение типов?
3. Под статическим связыванием типов я понимаю следующее: int y=2; - тип известен, компилятор выделяет под него память размером int (до выполнения, при компиляции). значение тоже известно - компилятор записывает его в ячейку int y.
4. Создает ли компилятор доп инфу, как в случае с виртуальными функциями для объявленных переменных, но не инициализированных?     int x; или int *p=new int[];

Добавлено через 10 минут и 47 секунд
Цитата(Gunslinger @  12.8.2008,  08:55 Найти цитируемый пост)
Создает ли компилятор доп инфу, как в случае с виртуальными функциями для объявленных переменных, но не инициализированных?     int x; или int *p=new int[];

имею ввиду соответствие название_переменной=адрес
PM MAIL   Вверх
Partizan
Дата 12.8.2008, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



Цитата

компилятор выделяет под него память размером int (до выполнения, при компиляции)


компилятор только компилирует....никакой памяти он "до выполнения, при компиляции" не выделяет...

Цитата

Код

 int x;
 int y=2;

Создает ли компилятор доп инфу, как в случае с виртуальными функциями для объявленных переменных, но не инициализированных?     int x; или int *p=new int[]; 


Вам думаете, что int x; - это позднее связывание?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1027 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.