0

boost::poolのメモリ プールを使用しようとしています#include "boost/pool/pool.hpp"
どのくらいのメモリが割り当てられているかを確認したいので、( manページから)を与えるboost::poolコマンドを実行しますsystem("ps aux | grep myProgramExe | grep -v grep | awk '{print $5}'");psVSZ - virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize).

私は何か奇妙なことをしています:

  1. コード (コードは 4 つのスペースでインデントされ、さらにリストに埋め込まれているため、さらに 4 つインデントされます)

    int main()
    {
        {
            boost::pool<> pool(4, 1);
            system("ps aux | grep boostHash | grep -v grep  | awk '{print \"1. \" $5}'");
            void *a = pool.malloc();
            pool.free(a);
            system("ps aux | grep boostHash | grep -v grep  | awk '{print \"2. \" $5}'");
        }
        system("ps aux | grep boostHash | grep -v grep  | awk '{print \"3. \" $5}'");
    }
    

出力は次のとおりです。

1. 18908
2. 19040
3. 19040

これは奇妙
です。私は 4 バイトだけを割り当てたいと思っていました (これnext allocationは 1 つのインスタンスのみである必要があります)。
b. ブロックが終了して死んでいる場合、メモリは解放されていませんpool

  1. ここで、サイズ 128 のインスタンスを割り当てたいと考えています。次の割り当てでは、次のように 1024 を割り当てたいと考えています。

    int main()
    {
        {
            boost::pool<> pool(128, 1024);
            system("ps aux | grep boostHash | grep -v grep  | awk '{print \"4. \" $5}'");
            void *a = pool.malloc();
            pool.free(a);
            system("ps aux | grep boostHash | grep -v grep  | awk '{print \"5. \" $5}'");
        }
        system("ps aux | grep boostHash | grep -v grep  | awk '{print \"6. \" $5}'");
    }
    

出力:

4. 18908
5. 19040
6. 18908

次の理由により、これは問題ありません。

を。バイトを割り当てたかったのです128 * 1024 = 131072が、バイトを取得しまし19040 - 18908 = 132KB = 135168た。135168 - 131072 = 4096バイト(それは単なるプールのオーバーヘッドだと思います)。
b. ブロックが終了すると、メモリが解放されました。

  1. デストラクタ

    int main() {
        {
            boost::pool<> *pool = new boost::pool<>(128, 1024);
            system("ps aux | grep boostHash | grep -v grep  | awk '{print \"7. \" $5}'");
            void *a = pool->malloc();
            pool->free(a);
            delete pool;
            system("ps aux | grep boostHash | grep -v grep  | awk '{print \"8. \" $5}'");
        }
        system("ps aux | grep boostHash | grep -v grep  | awk '{print \"9. \" $5}'");
    }
    

出力:

7. 19040
8. 19040
9. 19040

これは奇妙です
、A。何らかの理由で、サイズは既に割り当てられています (.b を呼び出す前に .b. でサイズが解放されていませpool.malloc()ん。
delete

これは説明可能ですか?プログラムが使用するメモリを確認する
代わりに、別のツールを使用する必要がありますか?ps

4

1 に答える 1

1

これは説明可能ですか?

はい。

プログラムで使用されているメモリを確認するには、ps の代わりに別のツールを使用する必要がありますか?

プログラムによって使用されるメモリが表示されます。

考慮しなかったこと: メモリ割り当てルーチンは大幅に最適化されています。ライブラリ (libc など) は、さまざまなシナリオで、さまざまな戦略を使用して割り当て/再割り当てを高速化します。一般的なメモリ管理戦略を次に示します。

  • オペレーティング システムから先制的にメモリを要求します。これにより、アプリケーションは、OS からより多くのメモリを要求するコストなしで、同じタイプの後続の内部割り当てを実行できます。

  • 解放されたメモリをキャッシュします。これにより、アプリケーションは後続の割り当てのために (OS から受け取った) メモリを再利用できます (また、それについて OS と対話するオーバーヘッドを回避できます)。

于 2015-03-09T13:44:37.787 に答える