Я пытаюсь использовать stxxl в качестве резервного хранилища для вектора. Если я ничего не сделаю, он автоматически выделит 1 гигабайт дискового пространства, и все будет работать отлично. Однако мне не нужно столько места, и на самом деле мне нужно грациозно масштабировать от моих оптимальных 512 мегабайт до минимальной емкости в 128 мегабайт.stxxl и overriding cxx_constructor
К сожалению, у меня есть stxxl :: vector, определенный в классе object-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 :: конфиг :: инициализации функции и гасятся по умолчанию один)
Edit 2: Размещение статического BOOL вокруг кода конструктора разбирает двойную интилизацию, и все работает так, как я ожидал. Это действительно мусорное решение :(
минуточку, это дважды звонил? Вы используете где-то несколько наследований? – ScarletAmaranth
@ScarletAmaranth: Я отправлю код, если вам нравится. Нет множественного наследования. – Goz
@ScarletAmaranth: Абсолютно определенный. Я поставил точку останова на вызов NSTemporaryDirectory и один на вызов pCfg-init. Затем он ударит точку останова 1, затем 2, а затем снова ударит точку останова 1, а затем 2. Журнал показывает, что было создано 2 файла (после чего произошел сбой, потому что, по-видимому, он пытается записать в тот же файл дважды). С такой реакцией, как вы даете это выглядит, как будто я * мог бы найти мою вторую подлинную ошибку компилятора (первая была в компиляторе GCC 2.9 Playstation 2 в начале 2001 года: D). – Goz