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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> virtual function, почему не делать всегда  
:(
    Опции темы
mes
Дата 29.7.2013, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(volatile @  29.7.2013,  19:37 Найти цитируемый пост)
Сравнение влажного с соленым

я не о сравнение динамического и статического полиморфизма,
а о сравнение оптимизации виртуального вызова со статическим полиморфизмом...



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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(bsa @  14.7.2013,  22:46 Найти цитируемый пост)
все стандартные контейнеры самодостаточны. Их не требуется как-то "дореализовывать".

Как говорит мОлодежь в интернетах - я бы вд..... дореализовывал...
Вот смотрите: такая комбинация в пользовательском коде:
Код
int x = container.back();
container.pop_back();
...

мягко говоря - не редкость. Так почему бы не реализовать
Код
T Container::takeBack();

как в той же КуТе ?

Или такой пользовательский код:
Код
std::vector< int >::const_iterator found = v.find( x );
if ( found != v.end() ) {
    ...
};

есть у 146% программистов. Так почему не ввести в контейнер функцию bool contains( T x ) const; ?

Я уже молчу про убогийший string::replace... Ну, везде... Просто везде... есть функция замены подстроки в строке на другую строку. Типа
Код
replace( string subStringToFind, string subStringToReplaceWith, Enum replaceAllOrReplaceFirst = ReplaceAll );


По существу вопроса: ИМХО, если ты достиг такого уровня в программировании, что ускорить твою программу может только (!!!) переход от виртуальных функций к обычным, то тебе нужно не задавать вопросы на форумах, а как минимум отвечать на них, а как максимум писать соответствующие статьи

P.S. Надо бы для "Premature optimization is the root of all evil" придумать такую же известную и запоминающуюся аббревиатуру как IMHO. Пусть будет PORE  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 29.7.2013, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



Цитата(mes @  29.7.2013,  21:48 Найти цитируемый пост)
я не о сравнение динамического и статического полиморфизма,
а о сравнение оптимизации виртуального вызова со статическим полиморфизмом...

Ну и что тут влажное, а что соленое ?
Оптимизировать можно только те виртуальные вызовы, (да и то только теоретически)
которые можно преобразовать к статическому полиморфизму.
Остальные (а их подавляющее большинство), оптимизировать нельзя даже теоретически.

Вообще, имхо, начинаете жонгллировать словами... 


Цитата(borisbn @  29.7.2013,  22:15 Найти цитируемый пост)
Надо бы для "Premature optimization is the root of all evil"

borisbn, по-сути да. В большинстве случаев не нужно предельное быстродействие. И можно пренебречь скоростью.

Просто здесь пытаются убедить что виртуалиация не медленее чем простой вызов.
А это в принципе не верно.


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


Опытный
**


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

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



Цитата(mes @ 29.7.2013,  15:03)
зато бывает в тестах, что мешает некоторым (как например тс)  адекватно оценить затраты на виртуальность..

Ну покажите свой пример, который не мешает реальной оценке затрат, 


borisbn
То что можно испортить стандартный код всем известно , 
Элементарный thead safety как ты сделаешь ?
Eсть у тебя foo(Vector& v ) - т,е рапер не пройдет 
и std::set где равные элементы это те где е1-е2 < некой дельты ,
опять же не меняя интерфейса 
foo(std::set& s) .

только других либ не предлагай  smile 

Тот кто скажет что такого в реальной жизни не бывает , как volatile
 просто не пишет больших апликаций  smile 
 



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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(borisbn @  29.7.2013,  23:15 Найти цитируемый пост)
int x = container.back();
container.pop_back();
О да! Нужная вещь... Вот только есть одна маленькая проблема, несущественная для простых типов. В случае takeBack произойдет 100% копирование объекта (в Qt это решено тотальным использованием PIMPL и COW). И если у тебя та же строка, то займет это не мало времени (хотя, в C++11 это можно эффективно оптимизировать).

Цитата(borisbn @  29.7.2013,  23:15 Найти цитируемый пост)
std::vector< int >::const_iterator found = v.find( x );
if ( found != v.end() ) {
    ...
};
А вот тут сложней. Я очень редко использую find для вектора (точнее, почти не использую). Так как у меня или сортированные вектора (lower_bound) или множества/мэпы. И у меня код обычно выгдялит так:
Код
container::iterator it = v.find(x);
if (it != v.end()) {
   //что-то делается с *it
}


Я бы вообще все эти штуки делал бы через отдельные функции:
Код
template<class Container, typename ValueType>
bool contains(const Container &c, const ValueType &v)
{
   Container::const_iterator i = c.find(v);
   return i != v.end();
}

PM   Вверх
borisbn
Дата 30.7.2013, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(bsa @  30.7.2013,  11:47 Найти цитируемый пост)
И у меня код обычно выгдялит так

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
sergioK1
Дата 30.7.2013, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bsa @ 30.7.2013,  10:47)
container.back();
container.pop_back();
О да! Нужная вещь... Вот только есть одна маленькая проблема, несущественная для простых типов. В случае takeBack произойдет 100% копирование объекта (в Qt это решено тотальным использованием PIMPL и COW). И если у тебя та же строка, то займет это не мало времени (хотя, в C++11 это можно эффективно оптимизировать).
[/QUOTE]
Когда возникают подобные ситуации то скоростью , размером приходиться жертвовать,
Точнее примемять там где она не критична ,

ну так кто-нидь предложит решение , 

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


Эксперт
****


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

Репутация: 37
Всего: 85



Цитата(sergioK1 @  30.7.2013,  10:48 Найти цитируемый пост)
Тот кто скажет что такого в реальной жизни не бывает , как volatile
 

Во первых я это говорил совсем по другому поводу...
Во вторых не нужно придираться к словам.

Вы пытаетесь доказать что умножение не требует затрат, осовываясь на том что
Цитата(volatile @  29.7.2013,  16:29 Найти цитируемый пост)
а = 2 * 2;

вычисляется моментально.

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

Замените слово "умножение", на "виртуализацию".
Все.

Добавлено через 7 минут и 35 секунд
Цитата(sergioK1 @  30.7.2013,  10:48 Найти цитируемый пост)
покажите свой пример, который не мешает реальной оценке затрат, 

В вашем случае, имхо, достоточно ввести глобальную оптимизацию
Потому-что хоть код и теоретически можно оптимизировать, но практически компиляторы пока даже этого не научились делать нормально.
Так что введите линк-тайм генерейшен, и глобольную оптимизацию
вы не сказали какой у вас компилятор, поэтому более конкретно подсказать не могу
PM MAIL   Вверх
volatile
Дата 30.7.2013, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



Вы, имхо, вообще измеряте не виртуализацию.  smile 
А я не телепат.что там у вас...

А вообще пишите как хотите.
меня удивляет что вродебы не новичкам, нужно доказывать что белое это белое. а черное это черное.
 smile 


Это сообщение отредактировал(а) volatile - 30.7.2013, 13:04
PM MAIL   Вверх
volatile
Дата 30.7.2013, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



PM MAIL   Вверх
sergioK1
Дата 30.7.2013, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(volatile @ 30.7.2013,  12:03)
меня удивляет что вродебы не новичкам, нужно доказывать что белое это белое. а черное это черное.
 smile


Cтрауспу поверил на слово он пишет что разницы  нет ,  или перевод  sucks .
основная причина  в инлайне IMHO 
Так что белое и что черное ?
PM MAIL   Вверх
volatile
Дата 30.7.2013, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



Цитата(sergioK1 @  30.7.2013,  15:44 Найти цитируемый пост)
Cтрауспу поверил на слово он пишет что разницы  нет 

Где он это пишет? ссыллку дайте.

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


Опытный
**


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

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



Цитата(volatile @ 30.7.2013,  16:45)
Цитата(sergioK1 @  30.7.2013,  15:44 Найти цитируемый пост)
Cтрауспу поверил на слово он пишет что разницы  нет 

Где он это пишет? ссыллку дайте.

В книге страница 515-520 ,
PM MAIL   Вверх
volatile
Дата 30.7.2013, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



Цитата(sergioK1 @  30.7.2013,  19:01 Найти цитируемый пост)
В книге страница 515-520 , 

У вас бред, вам это приснилось ...

Цитата
Q:Why are member functions not virtual by default?
A:Because many classes are not designed to be used as base classes. For example, see class complex. 
Also, objects of a class with a virtual function require space needed by the virtual function call mechanism - typically one word per object. This overhead can be significant, and can get in the way of layout compatibility with data from other languages (e.g. C and Fortran).

Bjarne Stroustrup's C++ Style and Technique FAQ


Это сообщение отредактировал(а) volatile - 30.7.2013, 20:51
PM MAIL   Вверх
Alexeis
Дата 30.7.2013, 21:57 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  Все эти оверхеды существенны для всякого рода железок. Для писшника 4 байта VMT ерунда, а вызов функции усложняется на одну инструкцию получения адреса функции по фиксированному смещению от начала VMT. Если для функции такая операция критична по времени, то следует подумать о том чтобы ее заинлайнить. Насколько я помню любая функция из секции импорта также требует дополнительной операции получения адреса, поскольку компилятор лишь знает где будет располагаться адрес функции после загрузки Dll . И никого не волнуют такие затраты. Мне кажется главная причина того что не все функции виртуальные это потеря прозрачности. Виртуальная функция сама по себе "сюрприз". Мы перекрываем виртуальную функцию, чтобы изменить поведение уже написанного кода, однако если код писал другой человек, то мы можем не знать заложенной логики и вместо правильно работающей чужой функции, в некотором месте может вызываться наша, которая уже может не знать замысла автора класса предка. 
  Иногда нужно создать функцию с тем  же именем что и виртуальная, но для своих целей, при этом мы хотим, чтобы замысел автора класса остался неизменным. Она будет заменять функцию предка, в новом классе при этом предок продолжить вызывать свою стабильную функцию. При глубокой иерархии мы можем и не знать имен всех функций и случайно назвать свою функцию также как одна из виртуальных функций предка. 
  Иными словами, виртуальность это некоторый механизм, который нужен только там где он нужен, как например механизм констант. Константы в С++ это круто это гибко, это безопасно, но никому не придет в голову делать все данные константами. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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