【发布时间】:2014-02-24 14:22:45
【问题描述】:
在stxxl 常见问题解答中,我发现了这个:
参数化 STXXL 容器
像 stxxl::vector 这样的 STXXL 容器类型只能参数化 具有 POD 的值类型(即没有虚函数,没有 用户定义的拷贝赋值/析构函数等)并且不包含 对内部内存的引用(包括指针)。通常,“复杂” 数据类型不满足此要求。
这就是为什么
stxxl::vector<std::vector<T> >和stxxl::vector<stxxl::vector<T> >无效。如果合适,使用std::vector<stxxl::vector<T> >,或通过以下方式模拟二维数组 做指数计算。
无法使用stxxl::vector<std::vector<T> > 非常有意义,因为stxxl 容器不会在容器调整大小时调用所包含元素的构造函数或析构函数。但是如何存储这样的结构:
struct S {
int* a;
}
如果我确实保证a 指向的对象只要存在stxxl::vector<S> 实例就有效,那么将这个struct 存储到stxxl::vector<S> 中有什么问题?如果必须将S 的特定实例移动到磁盘,则将a 指针的值写入磁盘。稍后,指针值被恢复,我可以使用它。显然,指针值也依赖于机器和实例,但这是一个问题即使我照顾了指向对象的生命周期吗?我没有通过套接字发送序列化对象,也没有将序列化对象存储在数据库中以供以后使用。
我错过了什么吗?
编辑:有人提醒我stxxl 不会复制指针,因此当我稍后检索struct S 的实例时,我可能会得到一个指向垃圾的指针。我知道。我保证指针在程序的整个生命周期内都是有效的。
【问题讨论】:
-
我的猜测是数据存储在这些指针有意义的虚拟内存地址空间之外的某个地方。
-
在这种情况下,这些指针在复制回它们“出生”的上下文时再次有意义。指针不只是一个整数吗?请注意
struct S不关心*a指向的对象的创建/销毁 -
容器必须针对值语义进行设计,就像它们的标准库对应物一样。所以任何指向内部数据的指针都必须指向容器自己管理的内存,而不是一些外部实体。
-
我对 STXXL 的了解不够(否则我会尝试回答这个问题),但我想如果你存储一个指针,它会保留它的值,你可以在以后取消引用它,只要它指向一个有效的对象。如果它做了其他事情,我会感到惊讶。
-
我认为(不熟悉这个库)这只是一个文档问题:他们试图让初学者很难错过这个限制,而不涉及有效高级使用的细节。跨度>