我試圖用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:周圍放置構造函數的代碼靜態布爾確實解決了雙重初始化問題,一切都按照我的預期工作。它是一個真正的垃圾解決方案雖然:(
保持,這將節省一些人一些麻煩一分鐘,這就是所謂的兩次?你在某處使用多重繼承嗎? – ScarletAmaranth
@ScarletAmaranth:如果你喜歡,我會發布代碼。沒有多重繼承。 – Goz
@ScarletAmaranth:絕對確定。我在NSTemporaryDirectory調用中放置了一個斷點,並在pCfg-init調用中放置了一個斷點。它將命中斷點1和2,然後再次命中斷點1,然後再命中2.日誌表明已創建了2個文件(之後發生崩潰,因爲它可能試圖將同一文件寫入兩次)。看起來像我*可能已經發現了我的第二個真正的編譯器bug(第一次在Playstation 2的GCC 2.9編譯器中,大約在2001年:D)。 – Goz