Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239

Возврат ссылки из метода

27.09.2017, 15:42. Показов 3528. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Дано:
структура:
C++
1
2
3
4
5
struct Point {
    float x;
    float y;
    float z;
};
класс:
C++
1
2
3
4
5
6
7
8
9
10
class myClass{
public:
    Point getPos();
private:
    Point pos;
};
 
myClass::getPos(){
   return pos;
}
Я так понимаю, что когда я выполняю это:
C++
1
2
3
4
myClass object;
Point posSecond;
 
posSecond= object.getPos();
В posSecond помещается копия значения pos из класса . А как мне передать ссылку на pos, чтоб не тратилось время на копирование, т.к. у меня этот метод вызывается в цикле для сотен тысяч объектов.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.09.2017, 15:42
Ответы с готовыми решениями:

Возврат двух значений из метода
Доброго времени суток, господа. Столкнулся с проблемой: нужно возвратить два значения с одного метода. Я нуб, не кидайтесь тапками. В...

Возврат ссылки
Задача которая считывает массив и определяет минимальный, макисмальный, первый отрицательный элемент, и их индексы. По заданию надо ее...

Возврат r-ссылки
Здравствуйте У меня вопрос, не могу понять почему так происходит Знаю, это бессмысленный код, он просто как пример, что бы разобраться ...

15
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
27.09.2017, 15:51
C++
1
2
3
Point& getPos() &;
const Point& getPos() const &;
Point getPos() const &&; // для r-value объектов возвращать ссылку чревато. лучше копию.
и еще не факт, что от возврата ссылки будет польза. выиграете от отсутствия копирования такого легкого и легкопируемого объекта, но можете сильно проиграть за счет накладных расходов на косвенный доступ к этому объекту. и вообще оптимизируйте только после профилирования. т.е. возвращайте как щас копию.
1
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
27.09.2017, 16:15  [ТС]
Цитата Сообщение от DU3 Посмотреть сообщение
и еще не факт, что от возврата ссылки будет польза.
Так уже проверил, польза есть Если я pos из private переношу в public и напрямую обращаюсь в цикле к переменной, не через метод, то производительность заметно возрастает. Ваш вариант еще не пробовал.
А можно поподробнее, для чего const прописывать два раза? и возвращать двойную ссылку?

Добавлено через 5 минут
Ну кстати да, воспользовался вашим первым вариантом, скорость не увеличилась, остается пока выносить свойство в public и обращаться к нему напрямую.
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
27.09.2017, 16:22
ну вы исключили вызов метода для доступа к точке, логично что от этого будет прирост. сделайте возвращающий метод inline функцией, после оптимизации должен быть такой же эффект, как если бы вы без метода объект получали. но в целом допустим от этих действий вы разогнали конкретно этот кусочек в 10 раз (на 1000%), что очень круто. но время, которое затрачивается на выполнение операции, внутри которой этот вызов, может уменьшиться лишь на сотые доли процента. т.е. в целом эффекта оптимизации не будет заметно для тех, кому нужны результаты операции. поэтому, сперва надо убедится в том, что такая оптимизация дает существенные выгоды.

по поводу константности и & в конце. в целом ваш метод константный. желательно его так и указывать.
& и && в конце - это перегрузки для l-value и r-value объектов. если вы получите ссылку на мембер какого-то r-value объекта, который тут же после вызова уничтожается, делая возвращенную ссылку - ссылкой на разрушенный объект, то при обращении к такой вот ссылке на мертвый объект можете поиметь много приколов.
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
27.09.2017, 17:06  [ТС]
Цитата Сообщение от DU3 Посмотреть сообщение
сделайте возвращающий метод inline функцией
А как это в классе реализовать?
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
27.09.2017, 17:45
C++
1
2
3
4
5
6
7
8
class myClass{
public:
  Point getPos() { // inline случае реализации тут
     return pos;
  }
private:
    Point pos;
};
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
27.09.2017, 19:06  [ТС]
Нее, инлайн тоже не помог, фпс проседает
написал так:
C++
1
2
3
4
5
6
7
8
class myClass{
public:
  inline Point getPos() {
     return pos;
  }
private:
    Point pos;
};
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
27.09.2017, 21:16
может оптимизацию включить забыли после отладки?
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
28.09.2017, 12:31  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
может оптимизацию включить забыли после отладки?
Это что такое? какая именно оптимизация?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
28.09.2017, 12:53
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
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
 
struct Point {
    Point() = default;
    // for example only
    Point(const Point &) { std::cout << "COPY CTR!!\n"; }
    float x;
    float y;
    float z;
};
 
class myClass{
public:
    myClass(const float x, const float y, const float z) {
        pos.x = x;
        pos.y = y;
        pos.z = z;
    }
    Point& getPos();
    const Point& getPos() const;
private:
    Point pos;
};
 
Point& myClass::getPos() {
   return pos;
}
 
const Point& myClass::getPos() const {
   return pos;
}
 
int main()
{
    myClass m(1, 2, 3);
    const Point &p1 = m.getPos();
    std::cout << p1.x << " " << p1.y << " " << p1.z << std::endl;
}
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
28.09.2017, 14:21
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Это что такое? какая именно оптимизация?
Это всерьез вопрос?! Допустим, да. Компиляторы не только переводят код с языка программирования в машинный, но попутно могут поменять его структуру, чтобы поведение сохранилось, но уменьшилось количество инструкций, что увеличивает скорость и уменьшает объем. В gcc / g++ это делается флагом -O0, -O1, -O2, -O3, -Os (лучшее по размеру), -Ofast (лучшее по скорости).
1
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
28.09.2017, 15:12  [ТС]
COKPOWEHEU, Я новичек в с++, и поэтому написал в соответствующую тему Я пока сильно не задумывался об тонкостях компиляции. Использую VS2015. Мне ещё очень многому нужно научиться, так что не серчайте за глупые (на ваш взгляд) вопросы На досуге почитаю об этом, спасибо за подсказку.

MrGluck, Я практически так и сделал, но скорость заметно падала при обращении к методу, нежели напрямую к свойству в public. Думал что это связано со временем копирования значения, поэтому и решил посылать ссылку, но это так же не помогло, оказалось что сам вызов метода занимает время.

Добавлено через 8 минут
По сути, я получил ответ на свой вопрос ещё в первом ответе. Спасибо всем за помощь
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
28.09.2017, 15:33
На самом деле при включенной оптимизации не будет разницы, прямое обращение или через get/set - компилятор сам подставит прямое обращение к приватному полю, только предварительно проверит, разрешено ли это.
P.S. как в VS2015 включается оптимизация не знаю, но метод научного тыка и лазанья по менюшкам никто не отменял.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
28.09.2017, 15:38
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
P.S. как в VS2015 включается оптимизация не знаю
Обычно в релизе она по умолчанию включена.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
28.09.2017, 16:08
То-то и оно что "обычно", а как будет у ТСа - неизвестно. Ну и надо было акцентировать внимание что методы set/get не замедляют работу и ими можно пользоваться.
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
28.09.2017, 18:05  [ТС]
Где оптимизация включается я нашел методом тыка. По умолчанию, она выключена. Прирост конечно есть, но больше всего прирост был от опции: "Основные проверки времени выполнения", стояло "Оба (/RTC1, эквивалентно /RTCsu) (/RTC1)", а я поставил "По умолчанию", т.к. после включения оптимизации, компилятор ругался, что с этим параметром одновременно нельзя включать, вот после этого скорость выполнения возросла ощутимо. Я ещё не читал про эти параметры, пока только экспериментировал
Действительно, после включения оптимизации, разница между get и прямым обращением пропала Спасибо за совет!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2017, 18:05
Помогаю со студенческими работами здесь

Возврат ссылки
int &amp; function(int); Понятно для чего передают аргументы в функцию как указатели или ссылки.Но зачем функция возвращает ссылку? Чтобы...

возврат копии обьекта класса из метода
Привет всем. Есть класс ниже в нём operator+. Помогите компилятор выдаёт ворнинг warning C4172: returning address of local variable or...

Возврат значения метода через указатель
Здраствуйте, помогите зделать что бы возврат результатов с метода решения уравнения возвращался через указатель. #include...

Возврат ссылки на функцию.
Здравствуйте, можете пожалуйста объяснить чем отличается когда функция создается просто каким то типом, и когда она создается ссылкой на...

Возврат ссылки из функции
Изучаю С++, знаю С. Вот такой простенький вопросик есть. В чем вообще разница: class Str { public: Str func() {return...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru