我试图使用stxxl作为向量的后备存储。如果我什么也不做,它就会自动分配1G的磁盘空间,一切都很完美。然而,我不需要分配那么多的空间,实际上,我需要优雅地从我的最优512 megs扩展到128 meg的最小存储空间。
不幸的是,我在objective类中定义了stxxl::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::Config构造函数中使用断点运行应用程序时,断点会被击中两次。我不在其他地方申报。cxx_constructor两次调用构造函数。
(还值得注意的是,我添加了自己的stxxl::config::init函数,并删除了默认函数)
编辑2:在构造函数的代码周围放置一个静态的bool确实可以解决双重初始化,一切都如我所期望的那样正常工作。不过,这是一个很垃圾的解决办法:
发布于 2012-01-21 13:03:15
好的,我想出了一个很好的方法来解决我的问题。我已经删除了整个类实例方法,现在我在应用程序委托"+ (void)初始化“函数中定义了stxxl设置。这只会被叫一次。
希望这能避免一些人在未来遭遇类似问题时遇到的麻烦:)
https://stackoverflow.com/questions/8947863
复制相似问题