0

ベクターのバッキング ストアとして stxxl を使用しようとしています。何もしなくても、自動的に 1 ギガのディスク容量が割り当てられ、すべてが完全に機能します。しかし、それほど多くのスペースを割り当てる必要はありません。実際、最適な 512 MB から最小で 128 MB のストレージまで適切にスケーリングする必要があります。

残念ながら、私は目的の c クラスで定義された stxxl::vector を持っており、そのクラスのインスタンス化で cxx_constructor 関数が呼び出され、stxxl が起動され、好きかどうかに関係なくギグが割り当てられます。

クラスをインスタンス化する前に、cxx_constructor 呼び出しをオーバーライドして init を追加する方法はありますか? cxx_constructor によってインスタンス化される単純なオブジェクトを作成しようとしました。残念ながら、何らかの理由で cxx_constructor がクラスのコンストラクターを 2 回呼び出します。

そのクラスに静的を追加して、複数回インスタンス化されるのを防ぐ唯一のオプションはありますか? これは間違いなく、あまりエレガントではないオプションです。1つは、なぜ2回呼び出されるのか知りたいです。

どんな情報でも大歓迎です!

編集:これが私が書いたコードです。

namespace stxxl
{
    class Config
    {
        float GetFreeDiskspace() 
        {
            float totalSpace = 0.0f;
            float totalFreeSpace = 0.0f;
            NSError *error = nil;  
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
            NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error: &error];  

            if (dictionary) {  
                NSNumber *fileSystemSizeInBytes = [dictionary objectForKey: NSFileSystemSize];  
                NSNumber *freeFileSystemSizeInBytes = [dictionary objectForKey:NSFileSystemFreeSize];
                totalSpace = [fileSystemSizeInBytes floatValue];
                totalFreeSpace = [freeFileSystemSizeInBytes floatValue];
                NSLog(@"Memory Capacity of %f MiB with %f MiB Free memory available.", ((totalSpace/1024.0f)/1024.0f), ((totalFreeSpace/1024.0f)/1024.0f));
            } else {  
                NSLog(@"Error Obtaining System Memory Info: Domain = %@, Code = %@", [error domain], [error code]);  
            }  

            return totalFreeSpace;
        }
    public:
        Config()
        {

            char cacheFileName[256];
            NSString* pTempDir      = NSTemporaryDirectory();
            strcpy( cacheFileName, [pTempDir UTF8String] );
            strcat( cacheFileName, "/stxxlcache" );

            const uint64_t  kFreeSpace          = (uint64_t)GetFreeDiskspace();

            const uint64_t kMaxCacheSize        = 512*1024*1024;
            const uint64_t kCacheSize           = (kFreeSpace > kMaxCacheSize) ? kMaxCacheSize : kFreeSpace;
            const uint64_t kMinCacheSize        = 2000 * ((1 << 15) >> 1) * sizeof( float );
            stxxl::config* pCfg  = stxxl::config::get_instance();
            pCfg->init( cacheFileName, kCacheSize, false );
        }
    };
};

次に、アプリ デリゲート内で次のように宣言します。

stxxl::Config                       mCallOnceConfig;

次に、stxxl::Config コンストラクター内でブレークポイントを使用してアプリケーションを実行すると、ブレークポイントが 2 回ヒットします。私はそれを他のどこにも宣言しません。cxx_constructor は、コンストラクターを 2 回呼び出します。

(独自の stxxl::config::init 関数を追加し、デフォルトの関数を空白にしたことも注目に値します)

編集 2 : コンストラクターのコードの周りに静的ブールを配置すると、二重の初期化が整理され、すべてが期待どおりに機能します。しかし、それは本当にゴミの解決策です:(

4

1 に答える 1

0

わかりました、私の問題に対するかなりエレガントな解決策を思いつきました。クラス インスタンス メソッド全体を削除し、アプリ デリゲートの "+ (void) 初期化" 関数内で stxxl セットアップを定義します。これは一度だけ呼び出されます。

うまくいけば、将来同様の問題が発生した場合に、一部の人々の手間を省くことができます:)

于 2012-01-21T13:03:15.883 に答える