stxxl и переопределение cxx_constructor

Я пытаюсь использовать stxxl в качестве резервного хранилища для вектора. Если я ничего не сделаю, он автоматически выделит 1 гига дискового пространства, и все работает отлично. Однако мне не нужно выделять такое много места, и, на самом деле, мне нужно изящно масштабировать от оптимальных 512 мегабайт до минимума 128 мегабайт.

К сожалению, у меня есть stxxl::vector, определенный в моем классе jective-c, и при создании этого класса вызывается функция cxx_constructor, которая запускает stxxl и распределяет концерт, нравится мне это или нет.

Есть ли способ, которым я могу переопределить вызов cxx_constructor и добавить свой init, прежде чем он продолжит создавать экземпляр моего класса? Я попытался создать простой объект, который будет создан cxx_constructor. К сожалению, однако, по неизвестной причине cxx_constructor дважды вызывает конструктор моего класса.

Является ли единственная возможность добавить статику в этот класс, предотвращая его создание более одного раза? Это определенно вариант просто не очень элегантный. Для одного я хотел бы знать, почему это называют дважды.

Любая информация высоко ценится!

Изменить: вот код, который я написал.

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, точка останова получает удар дважды. Я не заявляю об этом нигде. cxx_constructor вызывает конструктор дважды.

(Стоит также отметить, что я добавил свою собственную функцию stxxl::config::init и исключил функцию по умолчанию)

Редактировать 2: Размещение статического bool вокруг кода конструктора действительно сортирует двойную инициализацию, и все работает так, как я ожидал. Это действительно мусорное решение, хотя:(

1 ответ

Решение

Хорошо, я придумала довольно элегантное решение моей проблемы. Я удалил весь метод экземпляра класса, и теперь я определяю свою настройку stxxl в функции делегатов приложения "+ (void) initialize". Это ТОЛЬКО вызывается один раз.

Надеемся, что это избавит некоторых людей от хлопот, если они будут страдать от подобных проблем в будущем:)

Другие вопросы по тегам