Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ArtSL
8 / 7 / 0
Регистрация: 14.02.2010
Сообщений: 40
#1

Ссылки, стек - C++

11.08.2011, 20:19. Просмотров 477. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ссылки, стек (C++):

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

Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами - C++
Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами #include &lt;iostream&gt; #include &lt;stdlib.h&gt; ...

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

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

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

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

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

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

Добавлено через 3 минуты
Но я надеюсь, что эта разница обусловлена только отключённым оптимизатором.
1
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 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
Привет! Вот еще темы с ответами:

стек - C++
в функцию &quot;взятие из стека&quot; подается одно значение головы (нужное, правильное), а внутри функции уже совсем другое(не нужное и не...

Стек - C++
Реализовать при помощи одного массива два стека, суммарное количество элементов в которых ограничено длиной массива. Все стандартные...

Стек - C++
Ребят, объясните один момент если не сложно. Программа делает 3 операции со стеком, запоминает значение в стеке, показывает их и...

Стек - C++
Помогите, пожалуйста, выполнить задание: Сформировать динамическую структуру (вид структуры выбирается по варианту из табл.47),...


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

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

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