Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
ArtSL
8 / 7 / 1
Регистрация: 14.02.2010
Сообщений: 40
1

Ссылки, стек

11.08.2011, 20:19. Просмотров 510. Ответов 7
Метки нет (Все метки)

Полистал форум, подобная тема уже была, но ответ был "генерируется ошибка на подобную ситуацию".
В данном случае ошибки нет, в связи с этим вопрос:
Что помещается в стек в данном случае и ссылку на что принимает функция SetRadius()?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class SimpleCircle
{
    int itsRadius;
public:
    SimpleCircle(): itsRadius(0)
    {}
    ~SimpleCircle()
    {}
    void SetRadius(int const &radius)
    {
        itsRadius = radius;
    }
    int GetRadius() const
    {
        return itsRadius;
    }
};
 
int main(int argc, char *argv[])
{
    SimpleCircle obj;
    obj.SetRadius(2);
    cout << obj.GetRadius();
    return 0;
}
Просьба ответить тому кто действительно знает, а не "догадывается" или "думает".
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2011, 20:19
Ответы с готовыми решениями:

Используя стек, описать функцию проверяющую, является ли стек пустым
Используя стек, описать функцию проверяющую, является ли стек пустым

Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами
Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя...

Переменные в стеке. Где хранятся? Как обрабатываются? Есть ли программный стек или только стек процессора?
Есть у меня пробелы в познаниях, хотел бы их устранить. 1. Что такое стек в...

Заполнить стек 20 случайными числами с интервала [0; -10]. Вывести стек на экран. Изъять из стека каждый четвертый элеме
Заполнить стек 20 случайными числами с интервала . Вывести стек на экран....

Сформировать стек из 6 цифр. Вывести стек на экран. Удалить элементы из стека, увеличить каждый из них на единицу и снов
Сформировать стек из 6 цифр. Вывести стек на экран. Удалить элементы из стека,...

7
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
11.08.2011, 20:26 2
очевидно, ссылку на константное целое )
в данном случае в стек - ничего .
0
ArtSL
8 / 7 / 1
Регистрация: 14.02.2010
Сообщений: 40
11.08.2011, 20:28  [ТС] 3
эм, а где оно тогда хранится? для него ведь память не выделяется
0
grizlik78
Эксперт С++
2016 / 1497 / 206
Регистрация: 29.05.2011
Сообщений: 3,117
11.08.2011, 20:39 4
На самом деле, что помещать в стек, и где хранить константу — целиком дело компилятора.
Если не включать оптимизацию, то GCC создаёт временную переменную, адрес которой и передаёт в функцию. Но если оптимизацию всё-таки включить, то функция будет "встроена" и константа будет записана напрямую в нужное место. (На самом деле здесь компилятор весь класс выкидывает и сразу двойку в cout отправляет ).
2
ArtSL
8 / 7 / 1
Регистрация: 14.02.2010
Сообщений: 40
11.08.2011, 20:52  [ТС] 5
про оптимизацию подробнее можно где-нибудь почитать? что может откинуть, допустим компилятор вправе проигнорировать inline и т.п..
и.. такая запись функции считается корректной при передаче константы или правильнее передать по значению?
0
fasked
Эксперт С++
4984 / 2563 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.08.2011, 20:53 6
Цитата Сообщение от ArtSL Посмотреть сообщение
такая запись функции считается корректной при передаче константы или правильнее передать по значению?
Считается корректной, но особого смысла нет. То есть разницы между передачей по значению и по ссылке переменной типа int нет.
1
grizlik78
Эксперт С++
2016 / 1497 / 206
Регистрация: 29.05.2011
Сообщений: 3,117
11.08.2011, 21:04 7
Запись (int const &radius) корректна, но бессмысленна. Размер переменной равен или меньше адреса, который передаётся в функцию. Встроенные типы правильнее передавать по значению.
Про оптимизацию где почитать — не знаю. Я читаю ассемблерные листинги, полученные от компилятора с разными уровнями оптимизации

Добавлено через 3 минуты
Цитата Сообщение от fasked Посмотреть сообщение
То есть разницы между передачей по значению и по ссылке переменной типа int нет.
Ну вот в моём случае есть. Но не в пользу ссылки
1. запись двойки во временную переменную.
2. вычисление адреса (8 байт)
3. передача адреса в функцию.
Вместо
1. передача константы в функцию

Добавлено через 3 минуты
Но я надеюсь, что эта разница обусловлена только отключённым оптимизатором.
1
fasked
Эксперт С++
4984 / 2563 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.08.2011, 21:28 8

Не по теме:

Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну вот в моём случае есть. Но не в пользу ссылки
Конечно, передача по значению в данном случае более безопасна и эффективна. И писанины в какой-то степени меньше. Я с этим не спорю.
Но когда, например, реализуется шаблонный класс, то в итоге останутся все равно ссылки :) Случай другой, но я просто хочу сказать то, что передача по ссылке это не плохо.



Кстати. Для следующих двух случаев генерируется идентичный ассемблерный код.
C++
1
obj.SetRadius(214);
C++
1
2
3
4
int t = 214;
obj.SetRadius(t);
 
t = 25;
Assembler
1
movl    $214, -20(%rbp)
Что подтверждает:
Цитата Сообщение от grizlik78 Посмотреть сообщение
На самом деле, что помещать в стек, и где хранить константу — целиком дело компилятора.
Как видно, прямиком в регистр записывается
1
11.08.2011, 21:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2011, 21:28

при работе рекурсивной функции заканчивается стек и программа соответственно; как сделать так, чтобы она писала "стек закончился"?
Сабж g++ 4.5.0

Зачем нужны rvalue ссылки, если есть универсальные ссылки
Читаю книгу Скотта Мэйерса... Что-то я совсем запутался с этими rvalue...

Структура стек (: добавить элемент в стек, удалить элемент из стека, получить значение с вершины стека, размер стека...)
Всем привет,ребят помогите пожалуйста с лабой,вообще без понятия про стеки:(...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru