PROFI'den SUPERPROFI'ye kadar tüm sorularınız - 1. - sayfa 28

 
     // 2.2.6. Метод меняет размер отведённой памяти для файлового отображения. Метод в случае успешного завершения возращает TRUE или FALSE в случае ошибки.
     bool Resize( const DWORD64 dw64BytesMapping) // Количество резервируемой памяти для файлового отбражения.
     {
      DWORD         dwErrorCode = 0 ; // Последняя ошибка.
      tstringstream ssExclusion;     // Строка с сообщением об ошибке.
      dw64Bytes = dw64BytesMapping;
      ::SetLastError( 0 ); // Сбрасываем последнюю ошибку.
       // Контроллируем на наличие дескриптора файла и имени файлового отображения.
       if (hFile == NULL && sName == _T( "" ))
       {
         if (DEBUGGING || DEBUGGING_EXCLUSION)
         {
          ssExclusion << std :: endl << _T( "Ошибка в методе \"Utils::MappingSTL::Resize()\"." )
                      << std :: endl << _T( "Отсутствуют дескриптор пользовательского" )
                      << std :: endl << _T( "файла и имя файлового отображения." ) << std :: endl ;
           if (DEBUGGING) tcout << ssExclusion.str();
           if (DEBUGGING_EXCLUSION) throw (ssExclusion.str());
         }
         return ( false );
       }
       // Создаем или открываем уже существующее отображение файла по дескриптору пользовательского файла.
      vhMapping.push_back(::CreateFileMapping(hFile, NULL, PAGE_READWRITE, Utils::FILESIZE64(dw64Bytes).dwSizeHigh, Utils::FILESIZE64(dw64Bytes).dwSizeLow, sName.c_str()));
       // Если получен не верный указатель на файловое отображение.
       if (vhMapping.back() == NULL)
       {
         if (DEBUGGING || DEBUGGING_EXCLUSION)
         {
          dwErrorCode = ::GetLastError(); // Получаем последнюю ошибку.
          ssExclusion << std :: endl << _T( "Ошибка в методе \"Utils::MappingSTL::Resize()\"." )
                      << std :: endl << _T( "Размер памяти файлового отображения \"" ) << sName << _T( "\" не изменён." )
                      << std :: endl << LAST_ERROR_PARAMETER(dwErrorCode) << std :: endl ;
           if (DEBUGGING) tcout << ssExclusion.str();
           if (DEBUGGING_EXCLUSION) throw (ssExclusion.str());
         }
         return ( false );
       }
       return ( true );
     }
Bu, eşleme için bir sınıf yöntemidir.
 
Zhunko :
Bu, eşleme için bir sınıf yöntemidir.

Ve ne?

Yeniden boyutlandırma eşleme konusu açıklanmadı.

 
Bu hoşuma gidiyor.
 
Zhunko :
Bu hoşuma gidiyor.

Onlar. aynı ada ve farklı bir boyuta sahip bir eşleme açtığınızda, boyutu değişiyor mu?

Cevap vermek zorunda değilsin, zaten kodda yok. Orada yaptığın şeyin soruyla pek alakası yok :) iyi şanslar.

 

Tabii ki öyle. Bu sınıftaki kütüphane benim için çalışıyor. Testler tamam. Kumbarada bu kütüphanenin ilk versiyonu var.

Kütüphanenin son sürümü, ihtiyaca bağlı olarak boyutu değiştirir.

 
TheXpert :

Onlar. aynı ada ve farklı bir boyuta sahip bir eşleme açtığınızda, boyutu değişiyor mu?

Cevap vermek zorunda değilsin, zaten kodda yok. Orada yaptığın şeyin soruyla pek alakası yok :) iyi şanslar.

Andrey, iki seçeneği tekrar kontrol ettim.

hala evet. CreateFileMapping'i aynı adla ancak daha büyük boyutta çağırdığınızda, bellek genişletilir.
asıl mesele, CreateFileMapping'deki ilk tanıtıcının kapatılmaması gerektiğidir (önceki içeriği kaybetmemek için).


Ancak! İkinci durumda, hipotez daha ilginç bir şekilde test edildi.

CreateFileMapping bir başlangıç boyutuyla (örneğin 2 bayt) oluşturulur ve buna 4 bayt yazılır. Ve kendiliğinden otomatik olarak genişler!

Bu nedenle, büyük hacimli ikinci bir CreateFileMapping tanıtıcısı oluşturmaya gerek yoktur.

Bence konu kapanmıştır.
 
sergeev :

Ancak! İkinci durumda, hipotez daha ilginç bir şekilde test edildi.

CreateFileMapping bir başlangıç boyutuyla (örneğin 2 bayt) oluşturulur ve buna 4 bayt yazılır. Ve kendiliğinden otomatik olarak genişler!

Bu nedenle, büyük hacimli ikinci bir CreateFileMapping tanıtıcısı oluşturmaya gerek yoktur.

Bence konu kapanmıştır.
Açıklamada var. Kullanışlı, ancak boyutu yalnızca artıyor. Kaynak alır. Kendi bellek yöneticinizi yapmanız gerekir.
 
Zhunko :
Açıklamada var.

neyin açıklamasında? Gerçekten hafızamı geliştirmem gerekiyor.
 
sergeev :

neyin açıklamasında? Gerçekten hafızamı geliştirmem gerekiyor.

MSDN :-))

Demek istediğim, tüketilen bellek artarsa, serbest bırakılmasını sağlamak gerekir.

 
Tutamaç kapatıldığında, bellek (CreateFileMapping'de belirtilenden fazla olarak ayrılan) geri dönmüyor mu?