Я пытаюсь использовать stxxl в качестве резервного хранилища для вектора. Если я ничего не сделаю, он автоматически выделит 1 гига дискового пространства, и все работает отлично. Однако мне не нужно столько выделенного пространства, и, на самом деле, мне нужно изящно масштабировать от оптимальных 512 мегабайт до минимума 128 мегабайт памяти.
К сожалению, у меня есть stxxl :: vector, определенный в моем классе target-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 = 5121024;
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 и отключил функцию по умолчанию)
*1024*
Редактировать 2 : Размещение статического буфера вокруг кода конструктора приводит к двойной инициализации, и все работает так, как я ожидал. Это действительно мусорное решение, хотя: (