2013-10-23 37 views
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等的内容吗? 这是需要吗? Link

还是不如成员打包成一个struct

非常感谢:-)

+1

你可以做一个简单的测试:比较'sizeof(A)'和'sizeof(A :: a)+ sizeof(A :: b)'。如果这些值不等于,则在某处存在填充。 – Michael

回答

1

这是序列化的东西坏了,坏的方式。最有可能的,Eigen::Matrix对象涉及堆分配(即它们有指针),这意味着当您反序列化它们时您会感到不快。除此之外,你必须保证两个程序之间的对齐没有变化(通过打开一些优化选项很容易改变它,更不用说移植到另一个体系结构)。

序列化的正确方法是编写自己的序列化代码,以便携式方式写入事物或(更好地)找到随时可用的序列化代码(取决于您的库)。

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