|
|
|
Вопрос по оптимизации.
|
|||
|---|---|---|---|
|
#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); Имеется ввиду именно оптимизация по времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2006, 23:03 |
|
||
|
Вопрос по оптимизации.
|
|||
|---|---|---|---|
|
#18+
Код неправильный. Поэтому говорить о его скорости не приходится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2006, 01:46 |
|
||
|
Вопрос по оптимизации.
|
|||
|---|---|---|---|
|
#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:24 |
|
||
|
Вопрос по оптимизации.
|
|||
|---|---|---|---|
|
#18+
авторНо, что вы имели ввиду, под названием неправильный код? Наверно то, что во втором случае не выполняется условие задачи: вы не изменяете объект, на который ссылается BasePtr, а сразу присваиваете ему указатель на измененный. Кроме того, не понятно зачем вы создаете, а потом грохаете объект в втором варианте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2006, 10:46 |
|
||
|
Вопрос по оптимизации.
|
|||
|---|---|---|---|
|
#18+
Да, действительно, я не правильно выразился. Для меня главное, чтобы указатель BasePtr ссылался на объект с другими характеристиками, т.е. не на первый объект Son, а на второй. Причем не важно изменяется сам объект, как в первом случае, или же указатель позицируется на новый объект, как во втором. Вопрос же состоит в том же. Какой из двух вариантов будет работать быстрее. По сути дела второй должен выполнятся дольше, так как надо уничтожить объект и создать другой, но я не знаю сколько по времение работает приведение типа. К тому же во многих книгах пишут, что если приходится прибегать к приведению, то это говорит о плохом проектировании. Что вы думаете на этот счет. Что при этих условиях более предпочтительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2006, 10:59 |
|
||
|
Вопрос по оптимизации.
|
|||
|---|---|---|---|
|
#18+
авторПо сути дела второй должен выполнятся дольше, так как надо уничтожить объект и создать другой Ну да. авторно я не знаю сколько по времение работает приведение типа. Если речь идет о статическом приведении, как в данном случае, то нисколько. Оно осуществляется на этапе компиляции. авторЧто при этих условиях более предпочтительно Проектировать код так, чтобы избегать таких ситуаций. Если же к операции приведения типов прибегнуть пришлось, то использовать для этого операторы C++: static_cast, reinterpret_cast и прочие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2006, 11:35 |
|
||
|
Вопрос по оптимизации.
|
|||
|---|---|---|---|
|
#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, 17:05 |
|
||
|
Вопрос по оптимизации.
|
|||
|---|---|---|---|
|
#18+
Так писать нельзя: Base * BasePtr; ... ... BasePtr = Son(MySon); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2006, 21:52 |
|
||
|
Вопрос по оптимизации.
|
|||
|---|---|---|---|
|
#18+
Я не понимаю что-то разницы. В одном случае объект копируется, в другом удаляется старый и создается новый, копируясь из источника. Ну, ясное дело, что не удалять и создавать заново объект быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2006, 21:56 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33591900&tid=2031798]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 372ms |

| 0 / 0 |
