2012-01-20 2 views
0

Я пытаюсь использовать 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 вокруг кода конструктора разбирает двойную интилизацию, и все работает так, как я ожидал. Это действительно мусорное решение :(

+0

минуточку, это дважды звонил? Вы используете где-то несколько наследований? – ScarletAmaranth

+0

@ScarletAmaranth: Я отправлю код, если вам нравится. Нет множественного наследования. – Goz

+0

@ScarletAmaranth: Абсолютно определенный. Я поставил точку останова на вызов NSTemporaryDirectory и один на вызов pCfg-init. Затем он ударит точку останова 1, затем 2, а затем снова ударит точку останова 1, а затем 2. Журнал показывает, что было создано 2 файла (после чего произошел сбой, потому что, по-видимому, он пытается записать в тот же файл дважды). С такой реакцией, как вы даете это выглядит, как будто я * мог бы найти мою вторую подлинную ошибку компилятора (первая была в компиляторе GCC 2.9 Playstation 2 в начале 2001 года: D). – Goz

ответ

0

Хорошо, я придумал довольно изящное решение моей проблемы. Я отбросил весь метод экземпляра класса, и теперь я определяю настройку stxxl в делегатах приложения «+ (недействительными) инициализировать»функцию. Это только вызывается один раз.

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

 Смежные вопросы

  • Нет связанных вопросов^_^