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". Это ТОЛЬКО вызывается один раз.
Надеемся, что это избавит некоторых людей от хлопот, если они будут страдать от подобных проблем в будущем:)