我正在使用 x86 英特尔机器和 Windows 7,以及 Visual C++(版本 2005/2012 express)
我一直在玩对齐(我只是将其作为学习练习。)当然,我理解填充方面对类/结构大小的影响。我相信我理解由于 CPU 指令的工作方式和期望数据的方式,它也可以更好地对齐。
我一直在查看许多不同的资源,例如(有趣的) c++ 数据对齐/成员顺序和继承 (以及其他链接,如维基百科)http://en.wikipedia.org/wiki/Data_structure_alignment
可能会受到影响的一个领域(我读过)似乎是性能,因为数据需要为寄存器的特定大小,未对齐的数据可能会导致问题(参见维基百科)。
我编写了一些代码,在其中创建了 3 个结构,所有结构都具有相同的成员,打包设置为 1 ,正常对齐,并且重新排列了成员。这给了我大小为 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);
}
}
}
我对这些值并不感兴趣,因此向量中的每个元素都被初始化为相同的。无论如何,我得到的结果表明运行时间随着结构的大小而增加 - IE with pack(1) (8 bytes) 我得到了最快的 0.08s,而正常对齐 (12 bytes) 我得到了最慢的 0.105 。
我的问题是关于错误对齐的影响。在我作为 C++ 程序员的X年里,我认为我从来没有遇到过任何对齐问题,但当然它可能只是让我过去了。
(1)对齐在我的测试(编辑)中产生了影响(我相信),但是正如尼尔发布的那样,这只是由于 struct size 的差异。我尝试按照他的回复访问该成员,但我在那里没有看到任何实际效果....有更清晰的例子吗?有没有办法让我看到错位的巨大影响?(2)如果可能的话,有没有办法引起由错位引起的碰撞。