
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
09.03.2006, 23:03
|
|||
|---|---|---|---|
Вопрос по оптимизации. |
|||
|
#18+
Уважаемые знатоки С++, подскажите пожалуйста (до таких вещей я еще не дорос). Необходимо изменить объект, на который ссылается указатель базового класса. С точки зрения оптимизации какой насколько целесообразно использовать приведение указателей базовых классов к сыновьим, т.е. такой код class Base { }; class Son:public Base { }; Base * BasePtr; BasePtr = new Son; ... ... ... Son MySon; Son * SonPtr = (Son*)BasePtr; *SonPtr = MySon; или же более быстрым будет код Base * BasePtr; BasePtr = new Son; ... ... ... Son MySon; delete BasePtr; BasePtr = 0; BasePtr = Son(MySon); Имеется ввиду именно оптимизация по времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.03.2006, 01:46
|
|||
|---|---|---|---|
Вопрос по оптимизации. |
|||
|
#18+
Код неправильный. Поэтому говорить о его скорости не приходится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.03.2006, 10:24
|
|||
|---|---|---|---|
Вопрос по оптимизации. |
|||
|
#18+
Код исправил до работоспособности. class Base { public: virtual CString GetTest(); }; CString Base::GetTest() { return "Base"; } class Son:public Base { public: Son(Son &); Son(); CString Data; virtual CString GetTest(); }; Son::Son() { } Son::Son(Son &S) { *this = S; } CString Son::GetTest() { return Data; } 1 вариант Base * BasePtr; BasePtr = new Son; AfxMessageBox(BasePtr->GetTest()); Son MySon; MySon.Data="mYdATA"; Son * SonPtr = (Son*)BasePtr; *SonPtr = MySon; AfxMessageBox(BasePtr->GetTest()); 2 - й вариант Base * BasePtr; BasePtr = new Son; AfxMessageBox(BasePtr->GetTest()); Son MySon; MySon.Data="MyData"; delete BasePtr; BasePtr = 0; BasePtr = new Son(MySon); AfxMessageBox(BasePtr->GetTest()); Но, что вы имели ввиду, под названием неправильный код? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.03.2006, 10:46
|
|||
|---|---|---|---|
Вопрос по оптимизации. |
|||
|
#18+
авторНо, что вы имели ввиду, под названием неправильный код? Наверно то, что во втором случае не выполняется условие задачи: вы не изменяете объект, на который ссылается BasePtr, а сразу присваиваете ему указатель на измененный. Кроме того, не понятно зачем вы создаете, а потом грохаете объект в втором варианте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.03.2006, 10:59
|
|||
|---|---|---|---|
Вопрос по оптимизации. |
|||
|
#18+
Да, действительно, я не правильно выразился. Для меня главное, чтобы указатель BasePtr ссылался на объект с другими характеристиками, т.е. не на первый объект Son, а на второй. Причем не важно изменяется сам объект, как в первом случае, или же указатель позицируется на новый объект, как во втором. Вопрос же состоит в том же. Какой из двух вариантов будет работать быстрее. По сути дела второй должен выполнятся дольше, так как надо уничтожить объект и создать другой, но я не знаю сколько по времение работает приведение типа. К тому же во многих книгах пишут, что если приходится прибегать к приведению, то это говорит о плохом проектировании. Что вы думаете на этот счет. Что при этих условиях более предпочтительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.03.2006, 11:35
|
|||
|---|---|---|---|
Вопрос по оптимизации. |
|||
|
#18+
авторПо сути дела второй должен выполнятся дольше, так как надо уничтожить объект и создать другой Ну да. авторно я не знаю сколько по времение работает приведение типа. Если речь идет о статическом приведении, как в данном случае, то нисколько. Оно осуществляется на этапе компиляции. авторЧто при этих условиях более предпочтительно Проектировать код так, чтобы избегать таких ситуаций. Если же к операции приведения типов прибегнуть пришлось, то использовать для этого операторы C++: static_cast, reinterpret_cast и прочие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.03.2006, 17:05
|
|||
|---|---|---|---|
Вопрос по оптимизации. |
|||
|
#18+
Продалжая извращаться. class Base { public: virtual CString GetTest(); int Type; int GetType(){return Type;} }; CString Base::GetTest() { return "Base"; } class Son:public Base { public: Son(Son &); Son(); CString SonData; virtual CString GetTest(); }; Son::Son() { Type= 1; } Son::Son(Son &S) { *this = S; } CString Son::GetTest() { return SonData; } class Dauter:public Base { public: Dauter(Dauter&); Dauter(); CString DauterData; virtual CString GetTest(); }; Dauter::Dauter() { Type=2; } Dauter::Dauter(Dauter & D) { *this = D; } CString Dauter::GetTest() { return DauterData; } Base * BasePtr = new Son; switch (BasePtr->GetType()) { case 1: { Son * SonPtr = (Son*)BasePtr; SonPtr->SonData = "DataSon"; break; } case 2: { Dauter * DauterPtr = (Dauter*)BasePtr; DauterPtr->DauterData = "Data Dauter"; break; } } AfxMessageBox(BasePtr->GetType()); Следующий код выдает ошибку, насколько я понимаю, он обращается к памяти, которая ему не принадлежит. Почему? Проходит нормально все этапы, а на последнем выводе выдает огромадную ошибку. Подскажите пожалуйста, почему это может происходить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.03.2006, 21:52
|
|||
|---|---|---|---|
Вопрос по оптимизации. |
|||
|
#18+
Так писать нельзя: Base * BasePtr; ... ... BasePtr = Son(MySon); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.03.2006, 21:56
|
|||
|---|---|---|---|
Вопрос по оптимизации. |
|||
|
#18+
Я не понимаю что-то разницы. В одном случае объект копируется, в другом удаляется старый и создается новый, копируясь из источника. Ну, ясное дело, что не удалять и создавать заново объект быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&mobile=1&tid=2031798]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
190ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 512ms |

| 0 / 0 |
