Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ссылки на результат функции

309
11 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Просьба разъяснить подробности реализации следующего кода в различных версиях компиляторов С++.

Как будет реализована следующая ситуация.
 
Код:
TResult Func (TParams Params); // Функция возвращает объект

//....

void Main_Func ()
{[INDENT]TResult &Res = Func (...); // Объявление ссылки на результат функции
// .....
[/INDENT]}


Вопросы:
1. Будет ли работать такой код вообще. Не получится ли, что результат функции будет удалён из стека после выполнения присваивания?
2. Если объект будет оставлен в стеке до выхода ссылки из области видимости, то как к нему будет производиться обращение?
Произойдёт ли именование безымянной ранее области стека без создания ссылки (имя ссылки будет соответствовать адресу результата функции). Или же сама ссылка станет отдельным объектом, а обращение к объекту будет производиться по адресу, содержащемуся в ссылке.
5.4K
11 октября 2006 года
Svyatozar
221 / / 11.09.2006
 
Код:
int Func() {
    return 8;
}

int main() {
    int &Res = Func();
    return Res;
}
g++ reslink.cpp -o reslink
reslink.cpp: In function `int main()':
reslink.cpp:6: error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int'

на вопрос ответил?
1.8K
11 октября 2006 года
k3Eahn
365 / / 19.12.2005
VC++ 7.1:
Так компилится и работает:
Код:
int shitfunc()
{
 return 0xDEADBEEF;
};
 
int main()
{
 const int& res=shitfunc();
 std::cout<<std::hex<<res<<std::endl;
 return 0;
};

А вот без const не компилится.
Для небазовых типов привязка ссылки ко временному объекту проходит нормально и без const.
309
11 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Методом "научного тыка" было установлено следующее.
1. В некоторых случаях в строке объявления/присвоения ссылки наблюдалось warning-сообщение :confused: : "Temporary used to initialize 'ref'" - в основном, при наличии в коде попытки изменения объекта.
2. Несмотря на сообщение, глюков при выполнении не наблюдалось :)
3. Вызов деструктора для сложных объектов происходит автоматически при выходе из из области видимости ссылки.
4. Однако строка ref.Value++ (Value - поле типа int) выглядит как
 
Код:
mov eax, [ebp-0x44]
inc dword ptr [eax+0x04]

Надеюсь, господа "асматики" скажут, что именно происходит в этих строках. Но на мой взгляд, наблюдается прямое обращение к объекту, расположенному со смещением 44h относительно границы стека, а не тратится лишняя команда для адресации через ссылку.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог