Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2] 3  Все   Вниз
  Печать  
Автор Тема: Современный дизайн С++  (Прочитано 91272 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #30 : 17-03-2008 08:49 » 

sss, не верю Улыбаюсь но я не обязан платить за услугу которая мне не нужна Улыбаюсь
так же как за RTTI
Записан

Странно всё это....
sss
Специалист

ru
Offline Offline

« Ответ #31 : 17-03-2008 09:00 » 

Согласен. Просто я наверное уже закостенелый реликт, der neue gott...
Записан

while (8==8)
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #32 : 17-03-2008 11:17 » 

Цитата: sss
Начинаю разбираться - оказывается это расходы на полиморфизм!
В критических по времени исполнения приложениях это может быть именно так Улыбаюсь Хотя в большинстве случаев это совсем не так.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Not
Гость
« Ответ #33 : 28-09-2008 08:36 » 

Начинаю разбираться - оказывается это расходы на полиморфизм! Веришь?
Точное замечание. Прогулки по виртуальным таблицам увы небесплатны. Если важна скорость работы приложения, то статический полиморфизм - великолепная вещь. Если нужна гибкость объектной модели - динамический лучше. Все зависит от задачи.
« Последнее редактирование: 28-09-2008 09:14 от dimka » Записан
sss
Специалист

ru
Offline Offline

« Ответ #34 : 29-09-2008 00:29 » 

Интересно, что значит "прогулки по виртуальным таблицам"? Таблица существует в памяти, и по ней никто не гуляет. Просто адрес вызова берется из нее по смещению.
Записан

while (8==8)
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #35 : 29-09-2008 09:28 » 

sss, это значит, что до вызова функции нужно ещё во время исполнения прочитать её адрес из таблицы - дополнительная операция.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #36 : 29-09-2008 15:44 » 

У меня провокационный вопрос. А где нужно (действительно нужно и очень оправдано) использовать С++?

В наше время почти бесконечно дешевого железа языки Java и .Net дают вполне приличное быстродействие на офисных/финансовых задачах. Есть даже примеры разработки ядер операционных систем на таких языках (если память не изменяет, сборка мусора в ядре поддерживается в Plan9).

Бешеное быстродействие нужно во встроенных системах с жестким реальным временем, но даже для таких систем есть ОО язык Eiffel с поддержкой сборки мусора.

я в последнее время пишу преимущественно на связке Java+C, причем стараюсь как можно больше запихнуть в Джаву, и свести использование С к минимуму.

Так зачем вы используете С++? Для того, чтобы не искушать начальство, ибо сильно умных не любят?
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #37 : 30-09-2008 05:32 » 

npak, зачем холивары провоцируем? Улыбаюсь хотя конечно стоит задуматься может и переписать кое-что.

что касается сборки мусора, то в современном C++ это скорее вопрос дисциплины, чем реальная проблема умные указатели вполне справляются с возложенной задачей, а сочетании с пул аллокаторами дают очень приличную производительность в операциях с постоянным выделением/удалением памяти.
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #38 : 30-09-2008 06:07 » 

Цитата
Так зачем вы используете С++? Для того, чтобы не искушать начальство, ибо сильно умных не любят?
а если мне просто тупо красиво ? Улыбаюсь вкусно ? И тошнит от шарпов.
Кстати, вот Инге тока шо казал - моему начальству глубоко наплевать, на чём у него программисты пишут, лишь бы работало хорошо Улыбаюсь

----
кстати, пробовал щас поставить студию 2008 - не вышло, плохая пиратская копия, не сломали Отлично . Поставилась 2005. Если новый проект буду начинать - там буду делать. В MFC Улыбаюсь
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #39 : 30-09-2008 08:42 » 

Леш, а меня от C++ тошнит с его наворотами. Хотя и пишу на нем...

LogRus, тебе хорошо - ты на бустах руку набил, а для меня он как бред выглядит Жаль

Куда легче на Perl программить.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #40 : 30-09-2008 08:44 » 

RXL, кому что Улыбаюсь Меня от Perl и Bash воротит Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #41 : 30-09-2008 08:51 » 

вот. Всем разное нравится. О чём спор, господа ? Улыбаюсь
Записан

Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #42 : 30-09-2008 09:52 » new

Цитата: Алексей1153++
О чём спор, господа ?
npak поднял любопытный вопрос о критериях выбора языка.

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

Фактически, пробуют новое только новички, которые ещё не "застряли" на чём-то.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #43 : 30-09-2008 10:11 » 

а почему бы и не застрять, если оносейчас устраивает ? Улыбаюсь
Записан

Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #44 : 30-09-2008 12:53 » 

Алексей1153++, это ты проинтерпретировал под себя старый принцип "лучшее - враг хорошего" или, по пословице, "лучше синица в руках, чем журавль в небе".

Лично я в последнее время с новыми средствами знакомлюсь менее охотно по другой причине. Я сознаю, что пишу и проектирую хуже, чем мог бы. И понимаю, что новые языки и технологии это не исправляют. Поэтому я предпочитаю тратить время на совершенствование своих знаний и способностей, а не на освоение на практике чужих разработок. Хотя с идеями знакомлюсь охотно. Хочется создавать хорошо, а не потреблять "красивые фенечки". Как кто-то приводил высказывание безвестного подполковника: "В начале научитесь в сортире ссать, не промахиваясь, а потом уже будем высокие технологии осваивать." Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #45 : 30-09-2008 13:39 » 

dimka, что верно то верно. Улыбаюсь

И все же Java видится мне перегруженной. А пробовал года три назад браться за ее изучение и меня отпугнула сложность не самого языка (в нем то как раз не так много нового и правила его логичные), а "стандартных библиотек". К примеру, меня тогда интересовали аплеты: чтобы сделать обработчик GUI-события нужно наварачивать какие-то адептеры и прочую хрень. Т.е. для простых действий нужно долго возится со справочниками - крайне непродуктивно.
« Последнее редактирование: 30-09-2008 13:41 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #46 : 30-09-2008 14:19 » 

Цитата: RXL
чтобы сделать обработчик GUI-события нужно наварачивать какие-то адептеры и прочую хрень.
Зато это более логичный подход с точки зрения ООП в условиях строгой типизиации, нежели добавление в язык нетипизированных делегатов и т.п. вещей, которые нивелируют все преимущества строгой типизиации Улыбаюсь

Хотя согласен, что изучение этого подхода, да и вообще концепций любой стандартной библиотеки любого языка требует наличия адекватной книжки-справочника.

И, соответственно, возникает необходимости читать эту нередко очень объёмную кокнижку, что сразу угнетает.

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

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #47 : 30-09-2008 15:25 » 

dimka, золотые слова (последнее) Улыбаюсь

Я тяготею к языкам со слабой типизацией. Человеческие интерфейсы, в основном, связаны с текстом, а сильно типизированные языки только усложняют работу с ним. Работа с бинарными данными в языках со слабой типизацией не сложнее, чем в языках типизированных, а зато удобнее.
« Последнее редактирование: 30-09-2008 15:36 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #48 : 30-09-2008 16:55 » 

RXL, полностью согласен (с последним) Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
sss
Специалист

ru
Offline Offline

« Ответ #49 : 01-10-2008 00:36 » 

Мда... Наверное все таки люди, предпочитающие слабо типизированные языки, вообще не задумываются об расходах на "прогулки по виртуальным таблицам".
Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #50 : 01-10-2008 03:28 » 

Димка, так я ж согласное Улыбаюсь Знакомиться - всегда пожалуйста. Совершенствовать старое - тоже
Записан

Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #51 : 01-10-2008 05:38 » 

Цитата: sss
Мда... Наверное все таки люди, предпочитающие слабо типизированные языки, вообще не задумываются об расходах на "прогулки по виртуальным таблицам".
Да, а зачем о них задумываться при написании пользовательских формочек? Вот если речь идёт о каком-нибудь драйвере, обслуживании какой-нибудь быстро работающей железяки, написании конвертора или архиватора, 3D-графике - там, наверно, это надо.

P.S. Давеча прочитал про нетипизированное ООП в Perl и пришёл в ужас от синтаксического подхода к этому делу. Улыбаюсь Тогда уж лучше Lua или ECMAScript.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #52 : 02-10-2008 11:18 » 

Отделил последние сообщения о деталях Perl и ECMSScript в отдельную тему
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
АлексейК
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #53 : 09-10-2009 12:28 » 

Динамический полиморфизм позволяет сделать следующее:

class B
{
};

class D : public B
{
};

class C : public B
{
};

B* obj[2];
D* d = new D;
C* c = new C;
obj[0] = d;
obj[1] = c;

А как подобное сделать с помощью статического полиморфизма?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #54 : 09-10-2009 14:44 » 

АлексейК, а где тут полиморфизм вообще ? Тут тупо наследование
Записан

Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #55 : 09-10-2009 14:55 » 

АлексейК, в указанном примере происходит уменьшение информации о типе объектов, помещаемых в массив. Доводя уменьшение информации о типе до предела, получим решение вида:

Код: (C)
int x = 5;
char *message = "Hello world!\n";
void *items[2];
items[0] = (void *)&x;
items[1] = (void *)message;

В случае непосредственного применения шаблонов (templates), уменьшения информации о типе не происходит, т.к. специализированный шаблон образует в программе новый тип.

Если и можно, то так или иначе в решении должна теряться информация о типах. Мне такие решения, которые не сводятся к "void *" или к наследованию, не известны.

Алексей1153++, учи матчасть Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
АлексейК
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #56 : 09-10-2009 21:06 » 

Прошу прощения, пример не полный. Если добавить виртуальные функции, то можно использовать один массив obj для вызова разных методов f():

Код:
class B
{
virtual void f(){};
};

class D : public B
{
virtual void f();
};

class C : public B
{
virtual void f();
};

void D::f()
{
}

void C::f()
{
}

main()
{
B* obj[2];
D* d = new D;
C* c = new C;
obj[0] = d;
obj[1] = c;
for(int i=0; i<2; i++)
  odj[i]->f();
}

Вопрос остается в силе.
« Последнее редактирование: 07-12-2009 15:37 от Sel » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #57 : 10-10-2009 06:12 » 

А как подобное сделать с помощью статического полиморфизма?

Насколько мне представляется, статический полиморфизм - совсем отдельный инструмент, предназначенный совсем не для этого Улыбаюсь

Ты пытаешься работать с двумя объектами разных типов единообразно - как с объектами одного базового типа. Это возможно за счёт виртуализации.

Статический же полиморфизм позволяет, напротив, работать единообразно с объектами разных типов, которые, строго говоря, вовсе не обязаны принадлежать одной иерархии. Это достигается за счёт специализации шаблона - то есть, генерируется отдельная реализация для каждой используемой комбинации параметров шаблона.

Поэтому, в частности, можно использовать std::auto_ptr<Type1> и std::auto_ptr<Type2> единообразно (статически, а не в динамике). Или создавать std::vector<Type1> и std::vector<Type2> и делать для них, скажем std::sort или std::includes - порождать разные типы и оперировать с ними одинаково, пользуясь шаблонным интерфейсом.

То, чего ты хочешь, наверное, можно сделать через шаблоны и диспетчеризацию, но решение будет малость извращённым Улыбаюсь Например, вместо массива можно попробовать использовать специальный контейнер с диспетчеризацией по типу и перекрытым оператором []. Хотя я не уверен, что это будет работать. Потому что инструмент неподходящий.

Можешь ради любопытства посмотреть, как решаются сходные задачи, скажем, в ATL/WTL. Приходится использовать нешаблонный базовый класс с виртуальными методами, от которого наследуется шаблон, который диспетчеризирует вызовы своим специализациям-потомкам, требуя от них реализации дополнительных методов.
« Последнее редактирование: 10-10-2009 06:33 от Вад » Записан
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #58 : 10-10-2009 07:18 » 

Цитата: Вад
риходится использовать нешаблонный базовый класс с виртуальными методами, от которого наследуется шаблон, который диспетчеризирует вызовы своим специализациям-потомкам, требуя от них реализации дополнительных методов.
Да, так тип Variant обычно описывают. Но в том-то и дело, что только наследование обеспечивает уменьшение информации о типе: все потомки сводятся к одному общему предку и через интерфейс предка неразличимы.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #59 : 07-12-2009 15:16 » 

Dimka, то что все потомки "сводятся" к одному (хотя не одному, но это детали) типу, это хорошо!, а не плохо. Все дело в проектировании. архитектура в идеале должна быть такова, что в качестве параметра функции и/или мембера класса должен передаваться объект только с необходимым интерфейсом и НИЧЕГО более (т.е. если клиент модуля/объекта предполагается работать только с интерфейсом IObject, то другая функциональность ему не нужна). Так что это не минус, а плюс. Да, есть случаи когда "невозможно" (или в 90% случаев просто у архитектора не хватает абстрактного мышления для того чтобы "разложения" объектов на интерфейсы) это сделать эффективно, тогда надо будет в обход строгой типизации "поднимать" тип до более высокого. Это плохо (медленно и потенциально не безопасно), но нет кода без изъяна. задача в том чтобы свести такие преобразования к минимуму (в идеале обойти или пересмотреть архитектуру).

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

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

С уважением Lapulya
Страниц: 1 [2] 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines