2013-10-23 34 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)可以被該字大小整除,它們將是連續的)。