powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по оптимизации.
10 сообщений из 10, страница 1 из 1
Вопрос по оптимизации.
    #33591246
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые знатоки С++, подскажите пожалуйста (до таких вещей я еще не дорос).
Необходимо изменить объект, на который ссылается указатель базового класса.
С точки зрения оптимизации какой насколько целесообразно использовать приведение указателей базовых классов к сыновьим, т.е. такой код

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);


Имеется ввиду именно оптимизация по времени.
...
Рейтинг: 0 / 0
Вопрос по оптимизации.
    #33591359
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код неправильный. Поэтому говорить о его скорости не приходится.
...
Рейтинг: 0 / 0
Вопрос по оптимизации.
    #33591827
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код исправил до работоспособности.


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());




Но, что вы имели ввиду, под названием неправильный код?
...
Рейтинг: 0 / 0
Вопрос по оптимизации.
    #33591900
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНо, что вы имели ввиду, под названием неправильный код?
Наверно то, что во втором случае не выполняется условие задачи: вы не изменяете объект, на который ссылается BasePtr, а сразу присваиваете ему указатель на измененный.

Кроме того, не понятно зачем вы создаете, а потом грохаете объект в втором варианте.
...
Рейтинг: 0 / 0
Вопрос по оптимизации.
    #33591958
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, действительно, я не правильно выразился.

Для меня главное, чтобы указатель BasePtr ссылался на объект с другими характеристиками, т.е. не на первый объект Son, а на второй.

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

Вопрос же состоит в том же. Какой из двух вариантов будет работать быстрее.

По сути дела второй должен выполнятся дольше, так как надо уничтожить объект и создать другой, но я не знаю сколько по времение работает приведение типа. К тому же во многих книгах пишут, что если приходится прибегать к приведению, то это говорит о плохом проектировании. Что вы думаете на этот счет. Что при этих условиях более предпочтительно.
...
Рейтинг: 0 / 0
Вопрос по оптимизации.
    #33592107
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПо сути дела второй должен выполнятся дольше, так как надо уничтожить объект и создать другой
Ну да.

авторно я не знаю сколько по времение работает приведение типа.
Если речь идет о статическом приведении, как в данном случае, то нисколько. Оно осуществляется на этапе компиляции.

авторЧто при этих условиях более предпочтительно
Проектировать код так, чтобы избегать таких ситуаций. Если же к операции приведения типов прибегнуть пришлось, то использовать для этого операторы C++: static_cast, reinterpret_cast и прочие.
...
Рейтинг: 0 / 0
Вопрос по оптимизации.
    #33593497
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продалжая извращаться.


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());

Следующий код выдает ошибку, насколько я понимаю, он обращается к памяти, которая ему не принадлежит. Почему?


Проходит нормально все этапы, а на последнем выводе выдает огромадную ошибку. Подскажите пожалуйста, почему это может происходить?
...
Рейтинг: 0 / 0
Вопрос по оптимизации.
    #33593947
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так писать нельзя:
Base * BasePtr;
...
...
BasePtr = Son(MySon);
...
Рейтинг: 0 / 0
Вопрос по оптимизации.
    #33593953
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не понимаю что-то разницы. В одном случае объект копируется, в другом удаляется старый и создается новый, копируясь из источника. Ну, ясное дело, что не удалять и создавать заново объект быстрее.
...
Рейтинг: 0 / 0
Вопрос по оптимизации.
    #33594044
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТак писать нельзя:
Base * BasePtr;
...
...
BasePtr = Son(MySon);

Да, извините, я это уже в дальнейших сообщениях исправил.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по оптимизации.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]