2

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

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等等?这里需要这个吗?关联

还是将成员打包成一个更好的struct

非常感谢 :-)

4

1 回答 1

1

这是序列化事物的一种糟糕的、糟糕的方式。最有可能的是,Eigen::Matrix对象涉及堆分配(即它们具有指针),这意味着当您反序列化它们时您会感到不愉快。

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

序列化的正确方法是编写自己的序列化代码,以可移植的方式编写内容,或者(更好)找到一个现成的(取决于您的库)。

回到你的问题 - 不,不能保证实例A是连续的。事实上,它们很可能与“自然”字长对齐(如果sizeof(A)可被该字长整除,它们将是连续的)。

于 2013-10-23T18:39:12.587 回答