我使用英特爾的x86機器,和Windows 7,加的Visual C++(版本二千零十二分之二千零五快遞)數據的影響(MIS)對準
我一直在玩排列(我剛纔一直在做這個作爲一種學習練習)。當然,我理解在填充方面對類/結構大小的影響。我相信我明白,由於CPU指令工作和期望數據的方式,它也更好地對齊。
我已普遍在尋找許多不同的資源,例如(有趣) c++ data alignment /member order & inheritance (以及類似維基百科等環節),可以影響http://en.wikipedia.org/wiki/Data_structure_alignment
一個領域(我讀)似乎是性能,由於到需要數據爲寄存器的特定大小,未對齊的數據可能會導致問題(請參閱維基百科)。
我寫了一些代碼,我在其中創建了3個結構,所有成員的包裝設置爲1,常規對齊,並重新排列成員。這給了我的sizeof 8,10和12我跑了類似於以下每個代碼對象:
struct MixedData1
{
char Data1;
short Data2;
int Data3;
char Data4;
void operator() (MixedData1& md)
{
md.Data1 = 'a';
md.Data2 = 1024;
md.Data3 = 1000000;
md.Data4 = 'b';
}
};
typedef std::vector<MixedData1> MDVector;
int main(int argc, char* argv[])
{
MixedData1 md;
for(int count = 0; count < 10 ; count++)
{
{
std::cout << sizeof(md) << std::endl;
boost::timer::auto_cpu_timer t;
MDVector mdv(10000000);
std::fill(mdv.begin(),mdv.end(),md);
std::for_each(mdv.begin(),mdv.end(),md);
}
}
}
我不是在價值觀真正感興趣所以在向量中每個元素被初始化相同。無論如何,我得到的結果表明,運行時間隨結構的大小增加 - I.E with pack(1)(8字節)我得到最快的0.08s,並且與正常對齊(12字節)我得到最慢的0.105。
我的問題是關於被錯誤對齊的影響。作爲一名C++程序員,我不認爲自己曾經在整個我的X年有任何問題,但當然它可能只是通過了我。 (1)在我的測試(編輯)中,對齊有一個效果(我相信),但是Neil表示它只是由於結構大小的差異所致。我試圖通過他的回覆來訪問該成員,但我在那裏看不到真正的效果......是否有更清晰的例子?有沒有辦法讓我看到錯位的戲劇性效果? (2)如果可能的話,是否有辦法引起錯位造成碰撞?
在68000系列芯片(舊的Mac曾經擁有它們)未對齊的數據導致操作系統崩潰。這相當戲劇性。 – john
@John我會挖掘我的舊atari ST:P – Caribou