我正在使用C ++编写一个项目,我已经定义了一个类,除了一些数据外,还存储了一些指向这些数据的指针。简化,它看起来像这样:
class myclass{
std::array<int,N1> A;
std::array<int,N2> B;
std::array<int,N3> C;
std::array<int*,Np> Pt;
myclass(...) {...};
// other data and member functions
}
因此,Pt
是一个指针数组,指向A, B
或C
中的整数元素。我不知道哪个整数数组以及Pt
中指针指向哪个元素(这在运行时会不断变化),并且类使用这些指针来管理数据。现在我要复制并分配此类的对象:
myclass X(...);
myclass Y(...);
...
Y=X;
当然,问题是Y.Pt
中的指针仍指向X
中的int数组,因为存储在指针中的地址在复制时不会移位。为了解决这个问题并使Y.Pt
中的指针指向Y
中的相应元素,我有了使用指针算法来明确移动存储在Y.Pt
中的地址的想法。关于内存中位于X
和Y
之间的整数大小的数量,我通过计算YA [0]和XA [0]的地址之间的差异来找到(我假设与YB和XB或YC和XC中的第一个元素之间的差异相同:
size_t shift = &Y.A[0]-&X.A[0];
for (size_t i=0; i<Np; ++i)
{Y.Pt[i] += shift;}
所以,我尝试了这个并且似乎工作得很好,但是,即使我在具有不同编译器优化的不同机器上运行我的程序,这真的可以保存吗?如果Y.A
和X.A
之间的距离始终与Y.B
和X.B
之间以及Y.C
和{{1}之间的距离相同,则应该有效}}。我可以一直依赖吗?我可以将复制和分配想象为将整个对象的复制版本转换为内存中的新位置吗?或者它可能发生在例如出于优化原因,X.C
直接存储在X.A
旁边,同样地存储在Y.A
和B
中?
另一件事是C
占用超过1个字节(通常是4个字节)。如果int
和X.A
之间的内存距离不是4字节的倍数会发生什么,因为可能存在其他一些数据类型?我应该更好地将整数指针Y.A
和&X.A[0]
转换为像&Y.A[0]
这样的字节指针,并从那些字节数中计算char*
并使用它来执行转换吗?:
shift
会更好吗?是否有一些更好或标准的解决方案来解决这类问题?非常感谢您的帮助!