На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> "Новый взгляд" на контейнеры , по версии явиста
    Цитата settler @
    Не Вероятно, bad_alloc может у вектора случиться раньше , а случиться на 100%,

    То есть вот тут произошло событие с нулевой вероятностью? :D
    Code
    ExpandedWrap disabled
      #include <vector>
      #include <vector>
      #include <algorithm>
      #include <iostream>
      #include <map>
      #include <optional>
      #include <memory>
      #include <type_traits>
      #include <list>
      #include <sys/time.h>
      #include <sys/resource.h>
       
      template<class C> void gen()
      {
          C v;        
          for(int i = 0; i < 5000; ++i) v.push_back(i);
      }
       
      int main()
      {
          rlimit lim;
          lim.rlim_cur = 0;
          lim.rlim_max = 1000000;
          setrlimit(RLIMIT_AS, &lim);
          gen<std::vector<int>>();
          std::cout << "Vector was generated\n";
          
          //gen<std::vector<int>>();
          //std::cout << "Vector2 was generated\n";
          
          gen<std::list<int>>();
          std::cout << "List was generated\n";
      }
      }

    Вывод:
    ExpandedWrap disabled
      terminate called after throwing an instance of 'St9bad_alloc'
      Vector was generated
        what():  std::bad_alloc
      Aborted


    Если ты заменишь std::list в последнем примере на std::vector - внезапно всё отработает. Как это поведение объяснимо в твоей картине мира? :D

    Это сообщение было перенесено сюда или объединено из темы "Что несет Бьёрн Страуструп?"
    Сообщение отредактировано: OpenGL -
      Цитата OpenGL @
      Если ты заменишь std::list в последнем примере на std::vector - внезапно всё отработает. Как это поведение объяснимо в твоей картине мира?

      В реальных задачах память всегда дефрагментирована и bsd_alloc, когда ты пытаешься выделить один большой кусок памяти, случится гораздо вероятнее, чем когда вделяешь много маленьких.

      Вообще, сравнивать vector и list - это примерно как сравнивать пароход с паровозом - который из них лучше?
      Это совершенно разные структуры для реализации разных задач. Проблемы возникают ене потому что, один хуже или лучше другого, а потому, что для решения конкретной задачи используется не тот контейнер.

      Это сообщение было перенесено сюда или объединено из темы "Что несет Бьёрн Страуструп?"
        Цитата Олег М @
        В реальных задачах память всегда дефрагментирована и bsd_alloc, когда ты пытаешься выделить один большой кусок памяти, случится гораздо вероятнее, чем когда вделяешь много маленьких.

        Это понятно. Тут спорят с бредом "вектор потребляет больше памяти", которые его срасчёты вроде как по его мнению показывают.

        Это сообщение было перенесено сюда или объединено из темы "Что несет Бьёрн Страуструп?"
          Цитата OpenGL @
          Это понятно. Тут спорят с бредом "вектор потребляет больше памяти", которые его срасчёты вроде как по его мнению показывают.

          Ты понимаешь как вектор добавляет новый елемент ?
          Сколько он выделает памяти ? Сколько выделяет список ?

          Это сообщение было перенесено сюда или объединено из темы "Что несет Бьёрн Страуструп?"
            Цитата settler @
            Ты понимаешь как вектор добавляет новый елемент ?

            А почему ты спрашиваешь? Ты не догадываешься, что я на этот вопрос отвечу? :D
            Ответь лучше на вопрос выше - почему мой код падает с bad_alloc в случае списка и не падает в случае вектора если вектор занимает памяти больше :whistle:

            Это сообщение было перенесено сюда или объединено из темы "Что несет Бьёрн Страуструп?"
              Олег М, как ты понимаешь значение слова "дефрагментирована"?
              Потому как у меня при прочтении твоих постов возникают некоторые сомнения, что ты полностью понимаешь, что в них пишешь.

              Это сообщение было перенесено сюда или объединено из темы "Что несет Бьёрн Страуструп?"
                Цитата OpenGL @
                Цитата settler @
                Ты понимаешь как вектор добавляет новый елемент ?

                А почему ты спрашиваешь? Ты не догадываешься, что я на этот вопрос отвечу? :D
                Ответь лучше на вопрос выше - почему мой код падает с bad_alloc в случае списка и не падает в случае вектора если вектор занимает памяти больше :whistle:

                Ну так твой код, Я так писать еще не научился, ;)
                Вектор увеличивает памать в два раза, то есть выделил памать под 1000
                элементов - а надо 1001, так вот на 1001 он выделает *2 то есть 2000, (999байт коту под хвост)
                на 2001 - 4000, и т.д. Tак пишут в книгах по OS,
                в какой то момент будет out of memory, памяти всего может быть, но может не быть
                linear memory block, до сих что не так ?

                Лист не занимает больше памяти он больше выделает,(sizeof() = 24 дважды) и потом стирает,(см сорцы)
                фактически у него не два поинтера а три (третий temp каждый раз выделает и делилит память),
                возможно при больших обьемах он не увеличивает размер на два, возможно оптимизатор
                собирает статистику и выделает память более умно, но это мои догадки,

                так вот в твоем случае память не дефрагментирована, по сути пустая, нету с чего, и с тем что я написал не столкнулся, то есть нет проблем выделить linear memory block,


                Теперь проводи свое обьяснение, возможно оно будет лучше,
                Да для тех кто не в курсе от языка это не зависит.
                Да очень возможно что "папа" не несет чушь, зная ихний менталитет, думаю он
                специально не договаривает.

                Это сообщение было перенесено сюда или объединено из темы "Что несет Бьёрн Страуструп?"
                  settler, можешь объяснить, почему из своих наблюдений ты делаешь выводы, а из наблюдений других не делаешь никаких? Сколько тебе кода уже предоставили? Сам посчитаешь? Сколько коду было от тебя? Я уже посчитал.

                  Сообщения были разделены в тему "Новый взгляд на контейнеры"

                  Это сообщение было перенесено сюда или объединено из темы "Что несет Бьёрн Страуструп?"
                    !
                    JoeUser, заряжай.



                    Эта тема была разделена из темы "Что несет Бьёрн Страуструп?"
                    Сообщение отредактировано: JoeUser -
                      Цитата amk @
                      Олег М, как ты понимаешь значение слова "дефрагментирована"?
                      Потому как у меня при прочтении твоих постов возникают некоторые сомнения, что ты полностью понимаешь, что в них пишешь.


                      Ну, для начала расскажи как ты понимаешь значение этого слова, а то что-то у меня возникают сомнения.
                        Цитата settler @
                        Вектор увеличивает памать в два раза, то есть выделил памать под 1000
                        элементов - а надо 1001, так вот на 1001 он выделает *2 то есть 2000, (999байт коту под хвост)
                        на 2001 - 4000, и т.д. Tак пишут в книгах по OS,

                        Во-первых, если мне надо 1001 элемент, я выделю 1001 элемент, а не 1000, как это ни странно :D Во-вторых, это будет только при реаллокации, так что не страшно. В-третьих, на практике коэфициент 2 используют редко - обычно он меньше. И в-чётвёртых даже если предположить, что у меня действительно capacity вдвое больше, чем size, занимаемая память всё равно будет меньше из-за того, что sizeof(void*) в данном случае вдвое больше самого int-а, а это значит в твоём сценарии памяти съест вектор всё равно в полтора раза меньше, чем такой список :D

                        Добавлено
                        Цитата Олег М @
                        Ну, для начала расскажи как ты понимаешь значение этого слова, а то что-то у меня возникают сомнения.

                        Вероятно, он о том, что реально ты хотел сказать "в реальных задачах паметь фрагментирована" :)
                          Цитата OpenGL @
                          Вероятно, он о том, что реально ты хотел сказать "в реальных задачах паметь фрагментирована"


                          Да, точно, ошибся.
                            settler, вектор старается уменьшитьчисло перераспределений памяти, но не настолько. Ёмкость удваивается только пока вектор относительно небольшой. при средних размерах ёмкость увеличивается наполовину, Большие вектора увеличиваются при перераспределении где-то на четверть. При этом вектор всё так же имеет линейные затраты, просто константа увеличивается. При этом мы ещё и избавляемся от одного неприятного явления, проявляющегося при удвоении ёмкости, когда освобождённой ранее вектором памяти, даже после склейки освобождённых кусков всё время не хватает для нового буфера (память становится одноразовой).
                            Кроме того, если примерное количество мест в векторе известно, всегда можно запросить нужный размер вручную сразу, тогда вектор вообще перераспределять память не будет.

                            Добавлено
                            Олег М, просто ты такую ошибку допустил в каждом из мест, где писал о фрагментации.
                              Цитата amk @
                              settler, вектор старается уменьшитьчисло перераспределений памяти, но не настолько. Ёмкость удваивается только пока вектор относительно небольшой. при средних размерах ёмкость увеличивается наполовину, Большие вектора увеличиваются при перераспределении где-то на четверть. При этом вектор всё так же имеет линейные затраты, просто константа увеличивается. При этом мы ещё и избавляемся от одного неприятного явления, проявляющегося при удвоении ёмкости, когда освобождённой ранее вектором памяти, даже после склейки освобождённых кусков всё время не хватает для нового буфера (память становится одноразовой).

                              Это вполне логично,(свои вектора примерно так и делают),как ты понимаешь это тема есть в любом языке, в Ява сорцах явно видно как умножается на два (если надо могу выложить),
                              ArrayList на 3/2, где сказано про c++ vector что в нем так как ты говоришь, и как это
                              грамотно изменить для конкретной задачи ? В яве наследуют тут надо писать свой алокатор ?
                              или что ?

                              Добавлено
                              Цитата amk @
                              Кроме того, если примерное количество мест в векторе известно, всегда можно запросить нужный размер вручную сразу, тогда вектор вообще перераспределять память не будет.

                              Это понятно, я говорю о том когда неизвестно , лист для того и придумал,
                              да там оверхад в 16байт(два поинтера) и memory overflow будет как в примере OpenGL но когда сам обьект большой оно мало влияет, ну кто мешает юзать sigleList он есть в C++11 ЕМНИП.

                              Добавлено
                              Цитата OpenGL @
                              Во-первых, если мне надо 1001 элемент, я выделю 1001 элемент, а не 1000, как это ни странно :D

                              Как ни странно ты об этом не всегда заранее знаешь ;)
                              И представь себе что данные постоянно то стираються то добавляются снова,
                              В этом случае нужен лист и лучше single,

                              Добавлено
                              Цитата OpenGL @
                              Во-вторых, это будет только при реаллокации, так что не страшно.

                              Если реаллокации много то может и страшно, от задачи зависит.

                              Добавлено
                              Цитата OpenGL @
                              В-третьих, на практике коэфициент 2 используют редко - обычно он меньше.

                              Речь шла о стандартном контейнере , на практике ты можешь делать как ты хочешь,
                              если данные приходят стохастически, то не можешь подобрать правильную
                              статегию, Я в таких случаях делаю лист а потом зная четкий размер перегоняю в вектор,
                              а еще лучше если могу то в массив.

                              Добавлено
                              Цитата OpenGL @
                              И в-чётвёртых даже если предположить, что у меня действительно capacity вдвое больше, чем size, занимаемая память всё равно будет меньше из-за того, что sizeof(void*) в данном случае вдвое больше самого int-а, а это значит в твоём сценарии памяти съест вектор всё равно в полтора раза меньше, чем такой список :D

                              Не понял , кто у тебя void*

                              смотри еще раз мои расчеты, what is wrong here ?

                              ExpandedWrap disabled
                                class Node<T>{
                                 node* prev;
                                 node* next;
                                 T value;
                                 
                                }


                              sizeof(node) = sizeof(T) + sizeof(next) +sizeof(prev) для 64бит
                              будет sizeof(T) + 16,

                              для листа будет n(sizeof(T) + 16) ,

                              для вектора n*sizeof(T) , при увиличении на 2 или на х , то есть при первой перелокации
                              имеем
                              для листа будет (n+1)(sizeof(T) + 16) ,
                              для вектора х*n*sizeof(T)

                              если х небольшой то проблем нет если он 2 или 1.5 и Т большой то лист выигрывает и очень не слабо,
                              Понимаешь что все не однозначто еще есть cashing line problem , о которой програмисты C++, c 15-20 опытом молчат как партизаны ;) и вектор можно гонять потоками, как в яве 8,
                              а с листом (у него нет индекса) это сложнее.

                              В общем разные контейнеры для разных задач, и говорить что один лучше, есть показатель
                              собсвенных lack of knowledge ( не путать с luck слышиться одинаково ;) )

                              Все .
                                Цитата Qraizer @
                                settler, можешь объяснить, почему из своих наблюдений ты делаешь выводы, а из наблюдений других не делаешь никаких? Сколько тебе кода уже предоставили? Сам посчитаешь? Сколько коду было от тебя? Я уже посчитал.

                                Почему из других не делаю? вот код openGL
                                и навел, точнее дополнил, трех строк хватило,
                                а что в моих выводах не устраивает(они не мои а Вирта или
                                Таненбаума, и лет им по 20-25 если не больше ) . А ты типо про работу OS
                                никогда не слышал , ага счас поверил, ;)

                                А месть за КрымНеНашь (джо зажигай) это глупо, ты же не ватник типа Кили,
                                или програма , Или Я ошибаюсь ? ;)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0515 ]   [ 15 queries used ]   [ Generated: 18.04.24, 10:05 GMT ]