Переменные в функцию - стек или ОЗУ?

Тема в разделе "Микроконтроллеры AVR", создана пользователем parovoZZ, 24 янв 2019.

  1. DetSimen

    DetSimen Гуру

    Ты передаешь свою переменную как параметр и она какбэ пробрасывается внутарь функции
     
    Последнее редактирование: 25 янв 2019
  2. Asper Daffy

    Asper Daffy Гуру

    Не, дядь Вить, чёта Вы тут плаваете. Начнём с того, что ссылки бывают двух видов (lvalue и rvalue). Здесь пока (судя по примерам кода) обсуждались только первые. Так вот сам объект не копируется никогда - это создало бы неразрешимые проблемы для преобразования кода. Дед верно говорит, для lvalue ссылок "Внутри функции ссылка это просто псевдоним внешней переменной", но именно псевдоним, и никогда не она сама.

    А вот сама ссылка (переменная, описанная со значком &) - её можно куда угодно копировать, ибо это ничему не мешает, т.к. указатель на неё всё равно не возьмёшь и другая ссылка на неё никак ссылаться не может. В принципе, такая переменная может вообще не занимать память (это на усмотрение реализации).
     
    DetSimen нравится это.
  3. DetSimen

    DetSimen Гуру

    Слава Богу, взрослые подтянулись...
    Можно смело идти, встречать пятницувечер.
     
  4. В общем случае - да. В частном не только возможно, но и происходит.
    https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
     
  5. Asper Daffy

    Asper Daffy Гуру

    Да, я тоже собираюсь залезть на высокий логический уровень, плюнуть с него на все заморочки недели, и накатить за букву А. Потом уж по настроению, можно и за здоровье всех трезвенников или там за асинхронный таймер.
     
    DetSimen нравится это.
  6. Asper Daffy

    Asper Daffy Гуру

    DetSimen нравится это.
  7. parovoZZ

    parovoZZ Гуру

    так почему же по ссылке мы как-бы пробрасываем значение, а по указателю - указатель?
     
  8. SergeiL

    SergeiL Гуру

    Сейчас проверил, GCC съел нормально.
    А мелкософт С, досовский, (не С++) которым пользовался раньше - нифига,
    пишет:

    struct.c(7) : error C2059: syntax error : '&'

    Вот и помню, что нельзя так раньше было :)
     
  9. parovoZZ

    parovoZZ Гуру

    а не надо было
    -мяу
    говорить=)
     
    Asper Daffy нравится это.
  10. DetSimen

    DetSimen Гуру

    Не буду
     
    Asper Daffy нравится это.
  11. parovoZZ

    parovoZZ Гуру

    Ну как же. Вот пример (пращу пращенья (с) за копипаст)

    Код (C++):
    int value1 = 7;
    int value2 = 8;
    int &ref = value1; // хорошо, ref - теперь псевдоним для value1
    ref = value2; // присваиваем 8 (значение переменной value2) переменной value1 - здесь НЕ изменяется объект, на который ссылается ссылка!
     
  12. DetSimen

    DetSimen Гуру

    матьтваю, ты не 8 присваиваешь, а ref теперь у тебя псевдоним value2. то есть ref теперь ссылка на value2. в ref теперь её адрес храница, грубо говоря.

    UPD. Нет. Памойму, я здесь ошибаюсь.
     
    Последнее редактирование: 25 янв 2019
    Asper Daffy и SergeiL нравится это.
  13. DetSimen

    DetSimen Гуру

    и не путай ссылки в контексте обьявления переменной и ссылки в контексте параметров функций.
     
  14. DetSimen

    DetSimen Гуру

    есть кто из Питера? Пристрелите ящерку, а? Я налью. Мнооого....
     
    Asper Daffy нравится это.
  15. DetSimen

    DetSimen Гуру

    я пойду наливать по первой, а ты почитай пока более вменяемых людей
    https://habr.com/ru/post/251091/
     
  16. DetSimen

    DetSimen Гуру

    чего и тебе желаю
    01.jpg
     
  17. parovoZZ

    parovoZZ Гуру

    можно только в хвост
     
  18. Asper Daffy

    Asper Daffy Гуру

    Так, в языке С нет ссылок! Вы бы ещё классы там поискали.
     
  19. parovoZZ

    parovoZZ Гуру

    А AVR-GCC пофигу, какое расширение у файла - с или cpp - он всё воспринимает в стандарте С++?
     
  20. Asper Daffy

    Asper Daffy Гуру

    Кто сказал?

    А если запустить и посмотреть?

    Код (C++):
    void main(void) {
        int value1 = 7;
        int value2 = 8;
        int &ref = value1; // хорошо, ref - теперь псевдоним для value1
        cout << "value1=" << value1 << "; value2="  << value2 << "; ref=" << ref << endl;
        ref = value2; // п
        cout << "value1=" << value1 << "; value2="  << value2 << "; ref=" << ref << endl;
    }
     
    Результат:
    value1=7; value2=8; ref=7
    value1=8; value2=8; ref=8

    Вполне себе поменялось.

    Паровоз, Вы бы сами запускали и смотрели. Да и книжку бы какую-нибудь почитали.