我正在尝试使用 stxxl 作为向量的后备存储。如果我什么都不做,它会自动分配 1 gig 的磁盘空间,一切正常。但是我不需要分配那么多空间,事实上,我需要从我的最佳 512 兆存储空间优雅地扩展到最小的 128 兆存储空间。
不幸的是,我在我的 Objective-C 类中定义了 stxxl::vector 并且在该类的实例化时调用了 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::config::init 函数并取消了默认函数)
编辑 2:在构造函数的代码周围放置一个静态布尔值确实可以解决双重初始化问题,并且一切都按我的预期工作。虽然它是一个非常垃圾的解决方案:(