На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Задание типа выделяемой памяти с помощью значения аргумента шаблона класса , выбор типа памяти статическая или динамическая по аргументу шаблона
    Всем добрый день!

    Недавно знакомился с документацией матричной библиотеки шаблонов Eigen и был удивлен ее возможностями...

    Создавая объект матрицы можно задать ее размер и она выделит память либо на стеке, либо в куче в зависимости от значений аргументов (которые за это отвечают).
    Стало интересно как это реализовано, но там черт ногу сломит в коде. Может кто-нибудь может на пальцах объяснить, как это можно сделать в С++?

    Всего хорошего!
      Цитата Fedel @
      Создавая объект матрицы можно задать ее размер и она выделит память либо на стеке, либо в куче в зависимости от значений аргументов (которые за это отвечают).

      Кроме основной формы new используется размещающий оператор new.
      тут можно почитать
      Исходник может выглядеть так:
      ExpandedWrap disabled
        //...
         char BufferInStack[16384];
         BOOL Stack = ...;
         
         char *pBuf;
         if(Stack)  {pBuf = new (BufferInStack) char [sizeData];}
         else       {pBuf = new                 char [sizeData];}


      Возможны варианты.
      Можно сделать 2 комплекса процедур, выполняющих одну и ту же работу.
      Один комплекс использует исключительно стек, другой - кучу.
      Сообщение отредактировано: ЫукпШ -
        Цитата Fedel @
        Создавая объект матрицы можно задать ее размер и она выделит память либо на стеке, либо в куче в зависимости от значений аргументов (которые за это отвечают).
        Стало интересно как это реализовано, но там черт ногу сломит в коде. Может кто-нибудь может на пальцах объяснить, как это можно сделать в С++?
        Политиками. Или, как их иногда называют, стратегиями. Параметром шаблона приходит класс, который реализует по-своему требуемое поведение. Очень похоже на полиморфизм, только не ран-таймовый, а компайл-таймовый. Нередко его так и называют: статический полиморфизм.
        Вот синтетический пример (не компилировал даже, просто демонстрация возможности):
        ExpandedWrap disabled
          template <size_t Size>
          class HeapStorage
          {
            std::vector<unsigned char> storage;
           
          public:
            HeapStorage()  { storage.resize(Size);    }
            void* getBase(){ return &storage.front(); }
          };
           
          template <size_t Size>
          class StackStorage
          {
            std::array<unsigned char, Size> storage;
           
          public:
            void* getBase(){ return &storage.front(); }
          };
           
           
          template <size_t Size, template<size_t> class MemoryPolicy>
          class StorageHolder: MemoryPolicy<Size>
          {
          };
           
          /* использование */
           
          void f()
          {
            StorageHolder<1024,           StackStorage> lowMemoryUsing;
            StorageHolder<1024*1024*1024, HeapStorage> highMemoryUsing;
          /* ... */
          }
        Шаблоны, в отличие от дженериков, гораздо более богаты возможностями.
          Цитата ЫукпШ @
          Кроме основной формы new используется размещающий оператор new.


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

          Добавлено
          Цитата Qraizer @
          Шаблоны, в отличие от дженериков, гораздо более богаты возможностями.


          С Вами трудно не согласиться. То что я понял в коде, что шаблон класса матрицы наследуется от класса, который параметризуется этим же классом матрицы. Поэтому в исходном коде я и поплыл...
          Сообщение отредактировано: Fedel -
            Цитата Fedel @
            То что я понял в коде, что шаблон класса матрицы наследуется от класса, который параметризуется этим же классом матрицы.
            Curiosily Reccurring Template Pattern (CRTP)
            Сообщение отредактировано: Dushevny -
              Ну посмотри, например, в эту недавнюю тему, Fedel, но там больше теории, чем конкретики. Ещё можно сюда, тут простой и понятный пример.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0496 ]   [ 16 queries used ]   [ Generated: 25.04.24, 10:26 GMT ]