На главную Наши проекты:
Журнал   ·   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;
          /* ... */
          }
        Шаблоны, в отличие от дженериков, гораздо более богаты возможностями.
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0181 ]   [ 15 queries used ]   [ Generated: 27.09.22, 17:57 GMT ]