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

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

Войти
Регистрация
Восстановить пароль
 
-OggY-
0 / 0 / 0
Регистрация: 09.05.2013
Сообщений: 6
#1

Передача параметра, выделенного в куче, в функцию - C++

09.05.2013, 21:59. Просмотров 429. Ответов 13
Метки нет (Все метки)

Доброго времени суток. Возник такой вопрос.
Пусть имеется некоторый класс, под объект которого выделяется память:
C++
1
SomeClass pClass = new SomeClass();
И есть функция, которая принимает этот объект в качестве аргумента, копирует его внутри себя и не редактирует его. Так вот, как более корректно передавать этот объект в функцию?
C++
1
2
3
4
5
6
SomeFunc (const SomeClass &_someClass)
{
SomeClass someClass = new SomeClass (_someClass);
}
...
SomeFunc (*pClass);
или
C++
1
2
3
4
5
6
SomeFunc (SomeClass *_someClass)
{
SomeClass someClass = new SomeClass (*_someClass);
}
...
SomeFunc (pClass);
или
C++
1
2
3
4
5
6
SomeFunc (SomeClass _someClass)
{
// просто используем _someClass
}
...
SomeFunc (*pClass);
В первом случае выглядит как-то коряво, передавать ссылку на объект в куче через разыменование. Во втором теряется гарантия того, что объект не будет изменён. В последнем объект скопируется в стек, что не критично, но хотелось бы этого не делать.
Благодарю за ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2013, 21:59     Передача параметра, выделенного в куче, в функцию
Посмотрите здесь:

C++ Передача двумерного массива, как параметра в функцию
C++ Передача массива, как формального параметра в функцию
передача параметра в функцию C++
Передача функции (как параметра) в функцию унаследоваемого класса C++
C++ Передача файла в функцию в качестве параметра
C++ Передача параметра в функцию
Передача массива в функцию в качестве параметра C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
444 / 293 / 20
Регистрация: 22.03.2011
Сообщений: 957
Завершенные тесты: 2
09.05.2013, 22:25     Передача параметра, выделенного в куче, в функцию #2
C++
1
2
3
4
5
6
7
8
9
class A {}; //некоторый класс
 
void foo(A obj) {} // передача в функцию по значению, создаеться копия обьекта черещ конструктор копирования (С++ стиль)
void foo(A& obj) {} // передача в функцию по ссылке (С++ стиль)
void foo(const A& obj) {} //передача в функцию по ссылке при этом обьект константен
 
void foo(A* obj) {} // передача в функцию по указателю (Си стиль)
void foo(const A* obj) {} // передача в функцию по указателю при этом обьект константен
void foo(const A* const obj) {} // передача в функцию по указателю при этом обьект и указатель константны
Ответ на лично Ваш вопрос, так как Вам надо так и делайте.
-OggY-
0 / 0 / 0
Регистрация: 09.05.2013
Сообщений: 6
09.05.2013, 22:50  [ТС]     Передача параметра, выделенного в куче, в функцию #3
Да дело то в том, что мне по большому счёту без разницы, работают все три варианта. Я хотел разобраться, какой метод в таком случае более приемлем.
Наверное лучше использовать передачу по значению, раз всё равно объект копировать, тем более, что размер его вряд ли превысит 30кб.
stima
444 / 293 / 20
Регистрация: 22.03.2011
Сообщений: 957
Завершенные тесты: 2
09.05.2013, 22:58     Передача параметра, выделенного в куче, в функцию #4
Цитата Сообщение от -OggY- Посмотреть сообщение
Наверное лучше использовать передачу по значению, раз всё равно объект копировать,
Да. И нет)

Есть еще такое понятие как std::move. Если кратко то оно меняет местами "внутренние" указатели.
C++
1
2
3
4
void foo(const A& obj) //нету копирования
{
A copy = std::move(obj); //тоже нету копирования, но при этом обьект obj уже не валиден
}
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.05.2013, 00:29     Передача параметра, выделенного в куче, в функцию #5
Цитата Сообщение от -OggY- Посмотреть сообщение
В первом случае выглядит как-то коряво, передавать ссылку на объект в куче через разыменование
Нет там разыменования.
Цитата Сообщение от -OggY- Посмотреть сообщение
Во втором теряется гарантия того, что объект не будет изменён
Передавайте указатель на const.
Цитата Сообщение от -OggY- Посмотреть сообщение
В последнем объект скопируется в стек, что не критично, но хотелось бы этого не делать.
Не делайте.
-OggY-
0 / 0 / 0
Регистрация: 09.05.2013
Сообщений: 6
10.05.2013, 00:40  [ТС]     Передача параметра, выделенного в куче, в функцию #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Нет там разыменования.
Как это? А что же тогда такое *pClass ?
Цитата Сообщение от alsav22 Посмотреть сообщение
Передавайте указатель на const.
Я так понимаю, это
C++
1
SomeClass *const _someClass
но не
C++
1
const SomeClass *_someClass
?

Еще вопрос про первый случай (который я посчитал корявым), возникают ли в нём какие-то ненужные копирования или выделения на стеке?
stima
444 / 293 / 20
Регистрация: 22.03.2011
Сообщений: 957
Завершенные тесты: 2
10.05.2013, 00:45     Передача параметра, выделенного в куче, в функцию #7
Наоборот все что слева от * относиться к константности обьекта, справа указателя.

C++
1
2
const Class *obj консантный обьект
const Class * const obj консантный обьект и указатель
не забывайте что указатель это тоже число.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.05.2013, 01:25     Передача параметра, выделенного в куче, в функцию #8
Запутали. Что вы, собственно, разыменовываете если:
C++
1
SomeClass pClass = new SomeClass();
Может так?
C++
1
SomeClass *pClass = new SomeClass();
Добавлено через 21 минуту
Цитата Сообщение от -OggY- Посмотреть сообщение
Еще вопрос про первый случай (который я посчитал корявым), возникают ли в нём какие-то ненужные копирования или выделения на стеке?
По-моему, при передаче по ссылке, в любом случае (и в этом "корявом"), в функцию передаётся указатель (адрес). Поэтому, если есть указатель, нет смысла в передаче по ссылке, через разыменование указателя.
-OggY-
0 / 0 / 0
Регистрация: 09.05.2013
Сообщений: 6
10.05.2013, 10:50  [ТС]     Передача параметра, выделенного в куче, в функцию #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Может так?
Да, конечно же ) Проглядел.
Tulosba
10.05.2013, 11:46
  #10

Не по теме:

-OggY-, для разбора того, чем является идентификатор в С/С++ удобно пользоваться правилом "спирали":
http://c-faq.com/decl/spiral.anderson.html

-OggY-
0 / 0 / 0
Регистрация: 09.05.2013
Сообщений: 6
10.05.2013, 19:03  [ТС]     Передача параметра, выделенного в куче, в функцию #11
Коллеги со Stack Overflow убедили меня, что третий вариант самый приемлемый в моей ситуации, поскольку мне в любом случае нужна копия объекта, а 30кб (предполагаемый размер объекта) - не так страшно для стека на короткий период времени.
Всем спасибо за ответы.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.05.2013, 20:06     Передача параметра, выделенного в куче, в функцию #12
Если нужна локальная копия и размер объекта небольшой, то да. Тогда небольшое уточнение по коду: если нужна локальная копия, то, в первом и втором варианте, необязательно выделять память в куче.
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.05.2013, 20:09     Передача параметра, выделенного в куче, в функцию #13
Цитата Сообщение от -OggY- Посмотреть сообщение
копирует его внутри себя и не редактирует его
А где-то после копирования есть вообще редактирование? Может быть копия не нужна вовсе?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2013, 21:45     Передача параметра, выделенного в куче, в функцию
Еще ссылки по теме:

C++ Передача массива в функцию, как параметра
C++ Передача потока как параметра в функцию
Передача файла в функцию в качестве параметра C++
Передача параметра по указателю в виртуальную функцию C++
C++ Передача параметра в функцию класса

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

Или воспользуйтесь поиском по форуму:
-OggY-
0 / 0 / 0
Регистрация: 09.05.2013
Сообщений: 6
10.05.2013, 21:45  [ТС]     Передача параметра, выделенного в куче, в функцию #14
Цитата Сообщение от Tulosba Посмотреть сообщение
А где-то после копирования есть вообще редактирование?
Да конечно, копия сильно меняется впоследствии, иначе вопросов бы не возникало )
Yandex
Объявления
10.05.2013, 21:45     Передача параметра, выделенного в куче, в функцию
Ответ Создать тему
Опции темы

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