crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в QString объект из функции.
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Ponchikus Дата 20.1.2016, 13:42
  ViGOur, спасибо, теперь более понятно. Попробовал с тестовым классом поэкспериментировать, в самом деле получается что-то подобное тому, что Вы и описали. Всем спасибо за ответы !
ViGOur Дата 20.1.2016, 10:15
  Ну смотри, если бы все это отрабатывало без оптимизации, то вызовы были бы примерно такие:
Конструктор QString             // Создаётся локальный объект QString
Конструктор копий QString  // Копируется временный объект возвращенный из returnStr
Деструктор QString              // Удаляется локальный объект QString созданный в returnStr
...
Деструктор QString              // Удаляется локальный объект QString базовый
При оптимизации буду вызваны только Конструктор и Деструктор, что-то вроде:
QString *returnStr()
{
    return new QString("a");
}
int main()
{
    QString *str=returnStr();
}
Но со своим выделением памяти и своим сборщиком мусора

Для того, чтобы изучить как и что работает ты можешь создать обычный класс CClass например и сделать для него все то же самое поэкспериментировав с ключами оптимизации.
Алексей1153 Дата 20.1.2016, 8:03
  Ponchikus, ты выводишь адрес локальной переменной, которая уже будет уничтожена по выходу из функции. Поэтому адрес вполне уже может использоваться под новые нужды. Значение, которая вернула функция, используется в конструкторе при создании нового объекта (QString str), для которого и был использован уже освободившийся адрес


кстати, вот так

QString str;
str=returnStr();
qDebug()<<&str;



адрес может быть выведен другой (по логике - он обязательно другой будет)
Ponchikus Дата 19.1.2016, 21:34
  lanz, благодарю за пояснения, только всеравно не ясно, как у локальной переменной созданной в функции и у переменной созданной в другой функции может быть один и тот же адрес. Это странно.
lanz Дата 19.1.2016, 19:46
 
Цитата
принимает примерно следующий вид

Нет, RVO, означает что не создается временный объект для хранения значения, возвращаемого из функции.
Локальная переменная не отбрасывается, иначе бы qDebug() ничего не печатал бы.

Немного переделанный пример из википедии:
void returnStr(QString * _hiddenAddress) {
  *_hiddenAddress = "a";
}
Ponchikus Дата 19.1.2016, 18:45
 
Цитата(ViGOur @ 19.1.2016, 17:24) *
Это оптимизация такая: Return value optimization
Если поиграться с разными уровнями оптимизации, то скорее всего при -O0 должны быть разные адреса.


Если я правильно понял, функция returnStr(), благодаря этой оптимизации (в которой локальная переменная "string" как я понял вообще отбрасывается), в неявной форме принимает примерно следующий вид:

QString returnStr()
{
return QString("a");
}


Так ?

Спасибо за Ваш ответ.
ViGOur Дата 19.1.2016, 17:24
  Это оптимизация такая: Return value optimization
Если поиграться с разными уровнями оптимизации, то скорее всего при -O0 должны быть разные адреса.
Ponchikus Дата 19.1.2016, 15:32
  Доброго времени суток, уважаемые форумчане. Очень интересует следующий вопрос.

QString returnStr()
{
QString string("a");

qDebug()<<&string;        // например адрес 0x111111

return string;
}

int main()
{
...
QString str=returnStr();
qDebug()<<&str;         //тот же адрес, 0x111111
...


Почему в этом случае у переменной "string" и у переменной "str" один и тот же адрес ???
Спасибо!
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 0:42