我试图使用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
复制相似问题