Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
11 / 1 / 1
Регистрация: 02.10.2015
Сообщений: 98

Как избежать копирования вектора, при возврате его из функции?

12.08.2016, 14:55. Показов 3458. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос простой. В классе есть поле вектор, член - данные. Методом я возвращаю его
C++
1
2
3
const std::vector< unsigned char >& MyClass::prepare(  void ){ 
// . . . . .  Some code
return vTx;}
vTx - вектор. Вопрос, как поймать его при вызове метода, без копирования?

C++
1
const std::vector<unsigned char > vTemp = a.prepare( ); // a - пусть будет экземпляр Myclass
При таком вызове произойдет копирование? Если вектор, к примеру огромный..

Или сделать что-то типо такого

C++
1
2
const std::vector<unsigned char > *vTemp;
vTemp = &a.prepareTxBuf( g_Flash );
В дальнейшем может вектор vTemp понадобиться, для вывода информации, к примеру...там я передаю его как ссылку константную

C++
1
 void view( const std::vector<unsigned char > &vRx );
Тогд а вопрос. как такой метод использовать с указателем?
C++
1
 void view( *vTm)
??

Вопрос, корректны ли вышеприведенные строчки? или так не следует делать?? Не происходит ли глубокого копирования?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.08.2016, 14:55
Ответы с готовыми решениями:

Почему не вызывается конструктор копирования при возврате объекта из функции
Добрый день! Насколько мне известно, конструктор копирования вызывается: 1) при передачи объекта как аргумента функции ...

Access violation writing location 0x0000001C при возврате вектора из функции
При возврате вектора из этой функции выкидывает исключение Exception thrown at 0x00E78AC8 in test.exe: 0xC0000005: Access violation...

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования
Пишу шаблонный класс матриц. Делаю, значит, переопределение оператора + для двух матриц одного типа. Но компилятор ругается на эту функцию ...

10
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
12.08.2016, 14:57
почитайте про RVO и NRVO
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
12.08.2016, 15:49
ну тут какое дело, в теории (на уровне языка)

если компилятор поддерживает С++11, то дорогого копирование не будет вообще.
по идее должно происходить два перемещения, сначала из локального объекта функции в темповый объект справа от оператора присваивания, а затем перемещающий конструктор, который и сконструирует объект vTemp. так что на конференциях говорят, что теперь возвращать по значению контейнер из функции - это круто!
а в С++98 - это двойное копирование, дорого и порицаемо..

НО на практике на сцену выходят оптимизации компилятора
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
почитайте про RVO и NRVO
так вот там не будет даже этих двух перемещений, о которых я говорил, останется только одно.
так что в С++98 возможно это произойдет даже чуть быстрее, не будет вызова лишних конструкторов.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
12.08.2016, 15:53
Цитата Сообщение от Babysitter Посмотреть сообщение
на уровне языка
на уровне языка разрешено удалять ненужное копирование.
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
12.08.2016, 16:00
ну то есть в любом стандарте скорее всего при возврате локального объекта из функции по значению будет вызван один конструктор. никакого копирования, никакого перемещения, я прав?
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
12.08.2016, 16:10
Цитата Сообщение от Oryel Посмотреть сообщение
При таком вызове произойдет копирование? Если вектор, к примеру огромный..
конечно будет копирование, попробуйте:
C++
1
const std::vector<unsigned char >& vTemp = a.prepare( );
Добавлено через 4 минуты
метод возвращает ссылку на вектор, и если переменная имеет тип "просто" вектор, то будет копирование, как вы иначе представляете это себе?
C++
1
2
3
int Var;
int& refVar = Var;
int new_Var = refVar; //копирование
1
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
12.08.2016, 16:13
я еще и не прочитал условие, все ясно - рассказываю что-то про локальные объекты.
если нельзя опустошить объект справа, то ничего кроме копирования невозможно осуществить.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
12.08.2016, 16:13
Нет тут никаких RVO и NRVO у ТС. RVO и NRVO это, грубо говоря, когда создаётся в теле функции переменная, которая и возвращается из этой функции, а при вызове этой функции можно напрямую получить эту переменную без лишнего копирования. У ТС метод класса возвращает ссылку на поле класса.
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
12.08.2016, 16:15
я пытался про что-то такое
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
struct A
{
    A() { cout << "default\n"; };
    A(const A&) { cout << "copy\n"; };
    A(A&&) { cout << "move\n"; };
    ~A() {}
};
 
 
A foo()
{
    A a;
    return a;
}
 
int main()
{
    A a = foo();
    cout << endl;
}
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
12.08.2016, 16:22
Цитата Сообщение от Babysitter Посмотреть сообщение
я пытался про что-то такое
Вроде как по стандарту должен вызваться move ctor, однако оптимизация это всё завернёт и останется только default
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
12.08.2016, 16:42
А кстати еще нужно тсу предложить сохранить результат в ссылку на константный вектор. Никакого копирования и ридонли доступ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.08.2016, 16:42
Помогаю со студенческими работами здесь

Проблема при возврате строки из функции
Привет всем. Извините за ночное беспокойствие. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;ctype.h&gt; #include...

Затираются значения при возврате из функции initializer_list
Дарова. Объясните, почему при возврате объекта инитиализер_лист из функции значения этого листа трутся #include &lt;iostream&gt; ...

Непонятные символы при возврате строки из функции
Всем привет! Работаю с &quot;NVAPI&quot; (Библиотека, которая позволяет работать с видеокартами NVIDIA). В ней есть тип переменной...

Особенности использования указателей и ссылок в C++ при возврате из функции
Пусть у нас есть некий класс CBase и есть функция, которая создает и возвращает объект класса CBase. Создать она его может стеке или в...

Применение std::move к локальной переменной при возврате из функции
Response HostHandler::notFound() const { Response resp; resp.status = 404; return std::move(resp); } Имеет ли это...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru