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

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

Восстановить пароль Регистрация
 
Zzzs
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 2
05.02.2016, 09:06     Как stl контейнеры работают с объектами различных типов данных? #1
Интересует определяют ли STL контейнеры (в частности vector) какой тип данных они хранят, для соответсвтующей работе с ними в памяти? Если да, то как?
Я знаю в Qt тип необходимо задавать вручную через Q_DECLARE_TYPEINFO. В stl я ничего такого не нашел, там определение происходит автоматически, или же вообще все типы считаются комплексными и memcpy() и memmove() не используются?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2016, 09:06     Как stl контейнеры работают с объектами различных типов данных?
Посмотрите здесь:

C++ Ввод данных различных типов.
C++ STL, контейнеры классы
C++ контейнеры STL и виды деревьев
Ассоциативные контейнеры STL C++
Контейнеры STL C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.02.2016, 10:18     Как stl контейнеры работают с объектами различных типов данных? #2
Zzzs, Эм.
C++
1
std::vector<T>
где T это тип. Как это можно было не найти?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
05.02.2016, 11:48     Как stl контейнеры работают с объектами различных типов данных? #5
Цитата Сообщение от Zzzs Посмотреть сообщение
Он точно проверяет только на POD?
Он вообще врядли проверяет. Это я просто пример привел.
Цитата Сообщение от Zzzs Посмотреть сообщение
Как в данном случае поведет себя контейнер
Загляните в исходники
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
05.02.2016, 11:53     Как stl контейнеры работают с объектами различных типов данных? #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Он вообще врядли проверяет
Проверяет (хотя конечно от реализации STL зависит). Где-то читал, что в g++ сделали copy в 2000 строк, там как раз идут всякие проверки и делается максимально эффективное копирование. Внутрь правда не заглядывал.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
05.02.2016, 11:59     Как stl контейнеры работают с объектами различных типов данных? #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
Проверяет (хотя конечно от реализации STL зависит). Где-то читал, что в g++ сделали copy в 2000 строк, там как раз идут всякие проверки и делается максимально эффективное копирование. Внутрь правда не заглядывал.
Вы, видимо, имеете в виду выравнивание, количество данных, расширения архитектуры и т.п... Тут речь немного о другом, насколько я понял.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 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
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
05.02.2016, 12:10     Как stl контейнеры работают с объектами различных типов данных? #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
Нет, я имел ввиду как раз оптимизации
Так я и говорю что вы имеете в виду оптимизации.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 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++

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

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

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