none
HeapSetInformation Windows 7 64bit RRS feed

  • 質問

  • お世話になっております。ともやです。

    Windows7では、HeapSetInformation関数を呼び出してLFHに変更することはできないのでしょうか?

    以下のコードでテストしたのですが、パラメーターが間違っていますと表示されました。

     

    #include <Windows.h>
    #include <tchar.h>

    void Heap(HANDLE hHeap =::GetProcessHeap())
    {
     ULONG ulHeapInformationValue = 2;
     if( !::HeapSetInformation(hHeap, HeapCompatibilityInformation,
            &ulHeapInformationValue, sizeof(ulHeapInformationValue)) ) {

      DWORD dwErrorCode = ::GetLastError();
      HLOCAL hlocal;

      // エラーメッセージ生成
      BOOL bOk = ::FormatMessage(
       FORMAT_MESSAGE_FROM_SYSTEM |
       FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
       NULL,
       dwErrorCode,
       MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
       reinterpret_cast<LPTSTR>(&hlocal),
       0, NULL);
      if( !bOk ) {
       return;
      }
      ::MessageBox(NULL, reinterpret_cast<LPCTSTR>(::LocalLock(hlocal)), _T(""), MB_OK);
      ::LocalFree(hlocal);

     }
    }


    int _tmain()
    {
     ULONG ulHeapInformationValue = 2;
     HANDLE hHeap = ::HeapCreate(0, 4096, 4096 * 10);
     if( !hHeap ) {
      return -1;
     }
     Heap(/* default Heap of Process */);
     Heap(hHeap);

     return 0;
    }

     

     

    2010年9月25日 9:45

回答

  • 従来のメモリ割り当てに対して大量メモリやマルチプロセッサを考慮したものがLFHですから既にデフォルトなのでは?

    ちょっと調べたところ2つヒットしました。Low-fragmentation Heap の最初の行には

    Starting with Windows Vista, the system uses the low-fragmentation heap (LFH) as needed to service memory allocation requests. Applications do not need to enable the LFH for their heaps.

    とあります。

    またHeapSetInformation Function のHeapCompatibilityInformationには「Windows XP, Windows Server 2003, and Windows 2000 with hotfix KB 816542:」と条件が付けられていて、Vista以降には適用されないという読み方もできます。(or latorがない。)

    • 回答としてマーク ともや 2010年9月25日 11:44
    2010年9月25日 11:03

すべての返信

  • 従来のメモリ割り当てに対して大量メモリやマルチプロセッサを考慮したものがLFHですから既にデフォルトなのでは?

    ちょっと調べたところ2つヒットしました。Low-fragmentation Heap の最初の行には

    Starting with Windows Vista, the system uses the low-fragmentation heap (LFH) as needed to service memory allocation requests. Applications do not need to enable the LFH for their heaps.

    とあります。

    またHeapSetInformation Function のHeapCompatibilityInformationには「Windows XP, Windows Server 2003, and Windows 2000 with hotfix KB 816542:」と条件が付けられていて、Vista以降には適用されないという読み方もできます。(or latorがない。)

    • 回答としてマーク ともや 2010年9月25日 11:44
    2010年9月25日 11:03
  • Vistaでは(以降?)デフォルトで有効になって、LFHをきることもできないようになったんですね。ありがとうございます。

    HeapSetInformationのmsdnのその文章からVista以降には適用されないという読み方もできるんですね。

    気づかなかったです。ありがとうございます。

    いつも助けていただきありがとうございます。

    2010年9月25日 11:44
  • Debug Buildで試していますか?

    Release Buildでも同じ結果になりますか?

     

    Debugger環境ではLFHを有効にできません。

    その場合は、以下の環境変数をDebuggerに指定してください。

    _NO_DEBUG_HEAP=1

     

    それでもErrorになる場合は、以下を参考にしてください。

    http://support.microsoft.com/kb/929136

    (英語版のほうが読みやすいかもしれません)

    2010年9月25日 11:46
  • Debug BuildでもRelease Buildでも試しましたが、同じ結果(エラーメッセージ)でした。
    2010年9月25日 19:18
  • となるとReleaseでは、HeapQueryInformationで確認して必要に応じて呼び出すか、

    Applicationの動作要件がVista以降なら、そもそも呼び出す必要がないということですね。

    2010年9月26日 0:49