我有一个保存大量数据的C++类。
class obj {
public:
obj(data_t data) : large_data(data) {}
private:
data_t large_data;
};
以及一个子类,它使用名为pos
的不可变地址值来扩充大块数据。基本思想是,obj
最初没有位置,但一段时间后可能会被赋予一个永远不会改变的位置。
class safe_obj : public obj {
public:
safe_obj(int pos, data_t data) :
obj(data), pos(pos)
{}
int pos() const { return pos; }
private:
int pos;
};
到目前为止,我一直在创建obj
或safe_obj
实例的实例。我希望能够做的是有一种很好的方法来获取现有的obj
实例并为其分配位置,同时最大限度地减少任何数据移动。
我最初的想法是更改我的代码以始终分配safe_obj
然后将指针传递给一种类型或另一种类型。当需要分配位置时,实例将已经分配了该空间。
这种方法似乎需要某种类型的SetPos
接口,我想避免这样做,以严格执行位置的不变性。
另一种选择是将obj::large_data
存储在堆上,并在需要时将指针传递给全新的safe_obj
实例。
还有其他选择吗?
如果您不想要SetPos
接口,因为位置只能设置一次,则可以使用InitPos
接口。函数名称是不言自明的,第二次调用时会生成错误。
作为另一种选择,您可以在safe_obj
中使用obj
作为类成员而不是基类,但这会影响缓存局部性,因为pos
和large_data
不会彼此相邻。