具有特征矩阵的类的连续数据?

时间:2013-10-23 18:09:10

标签: c++ memory-alignment

这个简单类的类成员是否在内存中连续?

class A{
    A(){ /* somecode */}
    ~A();
    Eigen::Matrix<5,1,double> a;
    Eigen::Matrix<9,1,double> b;
};

std::vector<A> vec(10);

char * p = interprete_cast<char*>(&vec[0]);

// the pointer p can now continously access all "a" and "b" in continous order ->  (a,b,...,a,b)

// For example write all data to a binary file!
file.write( p, sizeof(A)*vec.size() )

在其他帖子中有关于#pragma pack等提及的内容? 这需要吗? Link

或将成员打包成struct

更好

非常感谢: - )

1 个答案:

答案 0 :(得分:1)

这是序列化事物的坏方法。最有可能的是,Eigen::Matrix对象涉及堆分配(即它们有指针),这意味着当你反序列化时,你会感到非常惊讶。

除此之外,你必须保证两个程序之间的对齐没有改变(通过打开一些优化选项很容易改变它,更不用说移植到另一个架构了。)

序列化的一种正确方法是编写自己的序列化代码,以便携方式编写内容,或者(更好)找到一个可以使用的代码(取决于你的库)。

回答你的问题 - 不, 保证A的实例是连续的。实际上,它们很可能与“自然”字大小一致(如果sizeof(A)可以被字大小整除,它们将是连续的。)