Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
1

Вызов лишних конструкторов и деструкторов в std::vector

14.07.2016, 14:29. Просмотров 414. Ответов 9
Метки нет (Все метки)

почему вызывает лишние конструкторы и вообще делает не то, что ожидаешь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class S {
public:
    int x;
    S() { cout << "cons" << endl; }
    S(const S& s) : x(s.x+100) { cout << "copy    x = " << x << endl; }
    S(const S&& s) : x(s.x+150){ cout << "move    x = " << x << endl; }
    ~S() { cout << "des    x = " << x << endl; }
};
int main() {
    S s;
    s.x = 6;
    vector<S> v;
    s.x=1;
    v.push_back(s);
    s.x=2;
    v.push_back(s);
    s.x=3;
    v.push_back(s);
    cout<<v[0].x<<' '<<v[1].x<<' '<<v[2].x<<endl;
    return 0;
}
вывод с move(без move, понятно, примерно тоже самое)
  • cons
  • copy x = 101
  • move x = 251
  • des x = 101
  • copy x = 102
  • move x = 401
  • move x = 252
  • des x = 251
  • des x = 102
  • copy x = 103
  • 401 252 103
  • des x = 401
  • des x = 252
  • des x = 103
  • des x = 3
или я не понимаю что из себя представляет вектор. можете объяснить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2016, 14:29
Ответы с готовыми решениями:

Наследование - вызов конструкторов и деструкторов
Делаю два класса - предок и потомок: class class_1_type { private: int t; public: ...

Вызов конструкторов/деструкторов при наследовании
Объясните пожалуйста, как получается вывод на экран 2531 #include &lt;iostream&gt; class A {...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор....

9
Грамотный. Безпорно.
16793 / 9692 / 1869
Регистрация: 27.09.2012
Сообщений: 24,053
Записей в блоге: 2
14.07.2016, 14:44 2
Цитата Сообщение от Хрисипп Посмотреть сообщение
или я не понимаю что из себя представляет вектор
Мы не знаем как Вы понимаете вектор
Цитата Сообщение от Хрисипп Посмотреть сообщение
вообще делает не то, что ожидаешь
А что Вы ожидаете и почему?
Цитата Сообщение от Хрисипп Посмотреть сообщение
можете объяснить?
Для начала можете выводить еще size и capacity вектора.
Так будет нагляднее.
Если коротко, то чтобы добавить элемент в вектор, нужна память,
вектор её выделяет, как правило, с запасом.
Этого запаса может не хватить для вставки нового объекта,
например, в векторе запасено памяти под 12 элементов,
а Вы вставляете 13-ый. Что делать?
Вектор выделяет новый кусок памяти, например,
достаточный для хранения 20-ти элементов,
копирует туда данные из старой памяти,
но обычное копирование байтов подойдет только для POD-типов,
а если у нас не такие? Значит нужно вызывать конструктор перемещения у объектов,
чтобы попытаться переместить объекты из старой памяти в новую.
Если же перемещение не доступно в принципе
(например ,у хранимых объектов нет перемещающего конструктора),
то придется воспользоваться конструктором копирования.
А после того, как всё это дело скопировали, нужно еще 13-ый элемент там построить.
А еще необходимо удалить старые объекты и освободить старую память.
1
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
14.07.2016, 15:25  [ТС] 3
Цитата Сообщение от Croessmah Посмотреть сообщение
А что Вы ожидаете и почему?
наивно ожидал увидеть 101 102 103, но теперь понимаю. просто думал, что он запросит памяти рядом и туда положит объект(а там же она и была свободна); а если не получится, выделит новый кусок памяти.
но получается он в любом случае в новую область копирует/переносит, при push-back?
0
Грамотный. Безпорно.
16793 / 9692 / 1869
Регистрация: 27.09.2012
Сообщений: 24,053
Записей в блоге: 2
14.07.2016, 15:31 4
Цитата Сообщение от Хрисипп Посмотреть сообщение
он в любом случае в новую область копирует/переносит, при push-back?
Если памяти не хватает, то что ему еще делать?
Цитата Сообщение от Хрисипп Посмотреть сообщение
наивно ожидал увидеть 101 102 103
Например, зарезервируйте достаточное количество памяти:
C++
1
2
    vector<S> v;
    v.reserve(10);
http://rextester.com/OVKIS33937
0
2660 / 1834 / 550
Регистрация: 05.06.2014
Сообщений: 5,305
14.07.2016, 15:44 5
Цитата Сообщение от Croessmah Посмотреть сообщение
Если памяти не хватает, то что ему еще делать?
Спрашивать ОС нельзя ли расширить уже выделенный блок памяти не перемещая его. Винда такое точно умеет. Но разработчики компилятора топикстартера, похоже, пошли путем наименьшего сопротивления. Впрочем, линуксовый g++ тоже такими плясками с бубном не заморачивается.
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
14.07.2016, 15:50  [ТС] 6
Croessmah, про взять память рядом я, конечно, замечтался. может добавят когда-нибудь такое?
или можно самому оформить?

Добавлено через 4 минуты
Цитата Сообщение от Renji Посмотреть сообщение
Но разработчики компилятора топикстартера, похоже, пошли путем наименьшего сопротивления.
на vs15 и на mingw 4.9 запускал. думаешь другие по-нормальному делали?
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.07.2016, 16:18 7
Цитата Сообщение от Renji Посмотреть сообщение
Спрашивать ОС нельзя ли расширить уже выделенный блок памяти не перемещая его. Винда такое точно умеет.
Какими API вызовами это обеспечивается, известно? В таком случае логично было бы предположить, что VC++ должен так действовать. Но делает ли он так?
0
2660 / 1834 / 550
Регистрация: 05.06.2014
Сообщений: 5,305
14.07.2016, 16:29 8
Цитата Сообщение от Tulosba Посмотреть сообщение
Какими API вызовами это обеспечивается, известно?
HeapReAlloc с флагом HEAP_REALLOC_IN_PLACE_ONLY . Если можно изменить размер блока не сдвигая - изменит. Иначе вернет NULL ничего не трогая.
1
13475 / 7138 / 1712
Регистрация: 30.01.2014
Сообщений: 11,943
14.07.2016, 16:58 9
Цитата Сообщение от Хрисипп Посмотреть сообщение
про взять память рядом я, конечно, замечтался. может добавят когда-нибудь такое?
Вектор - это последовательный контейнер, который по определению должен располагать память непрерывно, как в массиве. Если тебе нужно другое поведение, то нужно менять контейнер, а не мечтать про вектор. Посмотри на std::deque, например.
0
Грамотный. Безпорно.
16793 / 9692 / 1869
Регистрация: 27.09.2012
Сообщений: 24,053
Записей в блоге: 2
14.07.2016, 17:40 10
Renji, для начала, вектор запрашивает память не у системы, а у аллокатора.
А аллокатор же вполне может делать то, о чем Вы просите.
Посмотрите на второй параметр функции allocate у аллокатора.
Но вектор всё равно это не использует.
Второй (для allocator_traits третий) параметр в allocate не используется (это из gcc 5.3.0):
C++
1
2
3
4
5
6
7
8
pointer __new_start(this->_M_allocate(__len));
...
      pointer
      _M_allocate(size_t __n)
      {
    typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
    return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
      }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2016, 17:40

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Задание с использованием конструкторов и деструкторов
Нужна ваша помощь. Само задание: Разработать класс - СТУДЕНТ. В закрытой части определить данные:...

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

Правильное использование конструкторов и деструкторов
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class Worker...

Ошибки в программе с использованием конструкторов/деструкторов
Приветы Есть код: #include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;stdlib.h&gt;


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

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

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