PROFI에서 SUPERPROFI에 대한 모든 질문 - 1. - 페이지 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 );
     }
매핑을 위한 클래스 메서드입니다.
 
Zhunko :
매핑을 위한 클래스 메서드입니다.

그리고 뭐?

매핑 크기 조정에 대한 주제는 공개되지 않습니다.

 
나는 이것을 좋아한다.
 
Zhunko :
나는 이것을 좋아한다.

저것들. 같은 이름과 다른 크기로 매핑을 열면 크기가 변경됩니까?

당신은 대답할 필요가 없습니다, 그것은 어쨌든 코드에 없습니다. 당신이 거기에서하는 일은 질문과 거의 관련이 없습니다. 행운을 빕니다.

 

물론 그렇습니다. 이 수업의 라이브러리는 저에게 효과적입니다. 테스트는 괜찮습니다. 돼지 저금통에는 이 라이브러리의 첫 번째 버전이 있습니다.

라이브러리 자체의 마지막 버전은 필요에 따라 크기를 변경합니다.

 
TheXpert :

저것들. 같은 이름과 다른 크기로 매핑을 열면 크기가 변경됩니까?

당신은 대답할 필요가 없습니다, 그것은 어쨌든 코드에 없습니다. 당신이 거기에서하는 일은 질문과 거의 관련이 없습니다. 행운을 빕니다.

Andrey, 두 가지 옵션을 다시 확인했습니다.

여전히 그렇습니다. 이름은 같지만 크기가 더 큰 CreateFileMapping을 호출하면 메모리가 확장됩니다.
가장 중요한 것은 CreateFileMapping의 첫 번째 핸들이 닫히지 않아야 한다는 것입니다(단순히 이전 내용을 잃지 않도록).


하지만! 두 번째 경우에는 가설이 더 흥미롭게 검증되었습니다.

CreateFileMapping은 초기 크기(예: 2바이트)로 생성되고 4바이트가 기록됩니다. 그리고 자동으로 확장됩니다!

따라서 큰 볼륨으로 두 번째 CreateFileMapping 핸들을 생성할 필요가 없습니다.

문제가 종료되었다고 생각합니다.
 
sergeev :

하지만! 두 번째 경우에는 가설이 더 흥미롭게 검증되었습니다.

CreateFileMapping은 초기 크기(예: 2바이트)로 생성되고 4바이트가 기록됩니다. 그리고 자동으로 확장됩니다!

따라서 큰 볼륨으로 두 번째 CreateFileMapping 핸들을 생성할 필요가 없습니다.

문제가 종료되었다고 생각합니다.
설명에 있습니다. 편리하지만 크기만 증가합니다. 자원을 소모합니다. 자신의 메모리 관리자를 만들어야 합니다.
 
Zhunko :
설명에 있습니다.

무엇에 대한 설명에서? 정말 기억력을 향상시켜야 합니다.
 
sergeev :

무엇에 대한 설명에서? 기억력을 정말 향상시켜야 합니다.

MSDN :-))

이것은 소비되는 메모리가 증가하면 해제를 제공해야 함을 의미합니다.

 
핸들이 닫히면 메모리(CreateFileMapping에 지정된 메모리를 초과하여 할당됨)가 반환되지 않습니까?