2012-01-20 46 views
0

我試圖用stxxl作爲後備存儲的載體。如果我什麼都不做,它會自動分配1 G磁盤空間,一切都完美。不過,我不需要分配太多的空間,事實上,我需要從最佳的512兆到最小的128兆的存儲空間進行優雅的擴展。stxxl和壓倒一切的cxx_constructor

不幸的是我有stxxl :: vector在我的objective-c類中定義,並且在該類的實例化中調用了cxx_constructor函數,它啓動了stxxl並分配了一個gig,無論我喜不喜歡它。

有什麼辦法,我可以覆蓋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中的斷點::配置構造斷點被擊中兩次塗覆。我不會在其他地方聲明。 cxx_constructor調用構造函數兩次。

(這也是值得注意的是我添加我自己stxxl ::配置::初始化函數和削除默認的)

編輯2:周圍放置構造函數的代碼靜態布爾確實解決了雙重初始化問題,一切都按照我的預期工作。它是一個真正的垃圾解決方案雖然:(

+0

保持,這將節省一些人一些麻煩一分鐘,這就是所謂的兩次?你在某處使用多重繼承嗎? – ScarletAmaranth

+0

@ScarletAmaranth:如果你喜歡,我會發布代碼。沒有多重繼承。 – Goz

+0

@ScarletAmaranth:絕對確定。我在NSTemporaryDirectory調用中放置了一個斷點,並在pCfg-init調用中放置了一個斷點。它將命中斷點1和2,然後再次命中斷點1,然後再命中2.日誌表明已創建了2個文件(之後發生崩潰,因爲它可能試圖將同一文件寫入兩次)。看起來像我*可能已經發現了我的第二個真正的編譯器bug(第一次在Playstation 2的GCC 2.9編譯器中,大約在2001年:D)。 – Goz

回答

0

好,我想出了一個相當優雅的解決我的問題。我已經放棄了全班實例方法,現在我的應用程序代表中定義我的stxxl設置「+(無效)初始化」功能。這隻會被調用一次。

希望,如果他們遭受類似的問題在未來:)