【发布时间】:2012-10-24 18:13:47
【问题描述】:
我正在使用 x86 intel 机器和 Windows 7,以及 Visual C++(2005/2012 版 express)
我一直在玩对齐(我只是将其作为学习练习。)当然,我理解填充方面对类/结构大小的影响。我相信我理解由于 CPU 指令的工作方式和期望数据的方式,它也可以更好地对齐。
我一直在查看许多不同的资源,例如(有趣) c++ data alignment /member order & inheritance (以及维基百科等其他链接)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);
}
}
}
我对这些值并不真正感兴趣,因此向量中的每个元素都被初始化为相同的。无论如何,我得到的结果表明运行时间随着结构的大小而增加 - I.E with pack(1) (8 bytes) 我得到了最快的 0.08s,而正常对齐 (12 bytes) 我得到了最慢的 0.105 。
我的问题是关于错误对齐的影响。作为一名 C++ 程序员,我认为在我的 X 年中我从来没有遇到过任何对齐问题,但当然它可能只是让我忽略了。
(1) 对齐在我的测试(编辑)中产生了影响(我相信)但是正如 Neil 发布的那样,这只是由于结构大小的差异。我尝试按照他的回复访问该成员,但我在那里没有看到任何实际效果....有更清晰的例子吗?有没有办法让我看到错位的巨大影响? (2)如果可能的话,有没有办法引起由错位引起的碰撞。
【问题讨论】:
-
在 68000 系列芯片上(旧 Mac 曾经拥有它们),未对齐的数据导致操作系统崩溃。这是相当戏剧性的。
-
@John 我会挖出我的旧 atari ST :P
标签: c++ visual-studio alignment