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

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

Войти
Регистрация
Восстановить пароль
 
Zzzs
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 2
#1

Как stl контейнеры работают с объектами различных типов данных? - C++

05.02.2016, 09:06. Просмотров 249. Ответов 10
Метки нет (Все метки)

Интересует определяют ли STL контейнеры (в частности vector) какой тип данных они хранят, для соответсвтующей работе с ними в памяти? Если да, то как?
Я знаю в Qt тип необходимо задавать вручную через Q_DECLARE_TYPEINFO. В stl я ничего такого не нашел, там определение происходит автоматически, или же вообще все типы считаются комплексными и memcpy() и memmove() не используются?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
05.02.2016, 10:18     Как stl контейнеры работают с объектами различных типов данных? #2
Zzzs, Эм.
C++
1
std::vector<T>
где T это тип. Как это можно было не найти?
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12512 / 7074 / 794
Регистрация: 27.09.2012
Сообщений: 17,466
Записей в блоге: 2
Завершенные тесты: 1
05.02.2016, 10:57     Как stl контейнеры работают с объектами различных типов данных? #3
ForEveR, может имеются ввиду оптимизации?
Знаешь, типа
C++
1
2
3
4
5
6
7
new_data = allocator::allocate(...) ;
copy<is_pod<T>::value>(...) ;
...
copy<true>(...)
{
   memmove(...) ;
}
Zzzs
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 2
05.02.2016, 11:34  [ТС]     Как stl контейнеры работают с объектами различных типов данных? #4
Он точно проверяет только на POD?
Если у меня есть класс:
C++
1
2
3
4
5
6
7
class Circle {
public:
    Circle();
    Circle(const Vertex &position_, const float &size_);
    Vertex position;
    float size;
};
Он уже не является POD, но тем не менее его можно копировать через memcpy, т.к. он не содержит указателей. Как в данном случае поведет себя контейнер:
C++
1
2
3
std::vector<Circle> a;
// ... filling a ...
std::vector<Circle> b = a;
Неужели будет копировать поэлементно с вызовом конструктора на каждый элемент?
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12512 / 7074 / 794
Регистрация: 27.09.2012
Сообщений: 17,466
Записей в блоге: 2
Завершенные тесты: 1
05.02.2016, 11:48     Как stl контейнеры работают с объектами различных типов данных? #5
Цитата Сообщение от Zzzs Посмотреть сообщение
Он точно проверяет только на POD?
Он вообще врядли проверяет. Это я просто пример привел.
Цитата Сообщение от Zzzs Посмотреть сообщение
Как в данном случае поведет себя контейнер
Загляните в исходники
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
05.02.2016, 11:53     Как stl контейнеры работают с объектами различных типов данных? #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Он вообще врядли проверяет
Проверяет (хотя конечно от реализации STL зависит). Где-то читал, что в g++ сделали copy в 2000 строк, там как раз идут всякие проверки и делается максимально эффективное копирование. Внутрь правда не заглядывал.
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
05.02.2016, 11:59     Как stl контейнеры работают с объектами различных типов данных? #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
Проверяет (хотя конечно от реализации STL зависит). Где-то читал, что в g++ сделали copy в 2000 строк, там как раз идут всякие проверки и делается максимально эффективное копирование. Внутрь правда не заглядывал.
Вы, видимо, имеете в виду выравнивание, количество данных, расширения архитектуры и т.п... Тут речь немного о другом, насколько я понял.
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
05.02.2016, 12:09     Как stl контейнеры работают с объектами различных типов данных? #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от castaway Посмотреть сообщение
Вы, видимо, имеете в виду выравнивание, количество данных, расширения архитектуры и
Нет, я имел ввиду как раз оптимизации
Вот заглянул
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
inline _OI
    __copy_move_a(_II __first, _II __last, _OI __result) // это дергается из std::copy
    {
      typedef typename iterator_traits<_II>::value_type _ValueTypeI;
      typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
      typedef typename iterator_traits<_II>::iterator_category _Category;
      const bool __simple = (__is_trivial(_ValueTypeI) // очевидно для какой-то оптимизация
                         && __is_pointer<_II>::__value
                         && __is_pointer<_OI>::__value
                 && __are_same<_ValueTypeI, _ValueTypeO>::__value);
 
      return std::__copy_move<_IsMove, __simple,
                          _Category>::__copy_m(__first, __last, __result);
    }
это одна из реализаций __copy_move
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct __copy_move<_IsMove, true, random_access_iterator_tag>
    {
      template<typename _Tp>
        static _Tp*
        __copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result)
        {
#if __cplusplus >= 201103L
      // trivial types can have deleted assignment
      static_assert( is_copy_assignable<_Tp>::value,
                     "type is not assignable" );
#endif
      const ptrdiff_t _Num = __last - __first;
      if (_Num)
        __builtin_memmove(__result, __first, sizeof(_Tp) * _Num); // ВОТ!
      return __result + _Num;
    }
Как мы видим для тех типов, для которых можно сделать просто memmove оно делается.

Добавлено через 3 минуты
Кстати интересную штуку нашел, ForEveR недавно концепты упоминал, вот похоже уже используются
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<typename _II, typename _OI>
    inline _OI
    copy(_II __first, _II __last, _OI __result)
    {
      // concept requirements
      __glibcxx_function_requires(_InputIteratorConcept<_II>)
      __glibcxx_function_requires(_OutputIteratorConcept<_OI,
        typename iterator_traits<_II>::value_type>)
      __glibcxx_requires_valid_range(__first, __last);
 
      return (std::__copy_move_a2<__is_move_iterator<_II>::__value>
          (std::__miter_base(__first), std::__miter_base(__last),
           __result));
    }
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
05.02.2016, 12:10     Как stl контейнеры работают с объектами различных типов данных? #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
Нет, я имел ввиду как раз оптимизации
Так я и говорю что вы имеете в виду оптимизации.
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
05.02.2016, 12:11     Как stl контейнеры работают с объектами различных типов данных? #10
Цитата Сообщение от castaway Посмотреть сообщение
Так я и говорю что вы имеете в виду оптимизации.
На сколько я понял вопрос был как раз об этом
Цитата Сообщение от Zzzs Посмотреть сообщение
или же вообще все типы считаются комплексными и memcpy() и memmove() не используются?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2016, 12:13     Как stl контейнеры работают с объектами различных типов данных?
Еще ссылки по теме:

Возвращение различных типов данных C++
C++ Контейнеры, способные хранить данные произвольных (различных) типов
Контейнеры Stl, экзамен C++
Начала STL и контейнеры C++ C++
Начала STL и контейнеры C++ C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
05.02.2016, 12:13     Как stl контейнеры работают с объектами различных типов данных? #11
Цитата Сообщение от Kastaneda Посмотреть сообщение
На сколько я понял вопрос был как раз об этом
Х.з. Я не могу с уверенностью сказать что имел в виду ТС. А додумывать будет неправильно с нашей стороны.
Yandex
Объявления
05.02.2016, 12:13     Как stl контейнеры работают с объектами различных типов данных?
Ответ Создать тему
Опции темы

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