题
例如,如果我宣布一个漫长的变量,我可以假设它将始终是对准一个"sizeof(长期)"边界?微软视C++在线帮助是这么说的,但是它的标准的行为?
一些更多的信息:
a.它是能够明确地创建一个未整数(*巴):
char foo[5]
int*bar=(int*)(&foo[1]);
b.显然,#pragma pack()仅影响的结构、课程、以及工会。
c.MSVC文件的国家POD类型是对准他们各自的大小(但是它总是或默认,而是它的标准的行为,我不知道)
解决方案
正如其他人已经提到的,这不是标准的一部分并且是留给编译器,来实现,因为它认为合适的处理器在的问题。例如,VC可以很容易地实行不同的准要求的一个手臂处理并不x86处理器。
Microsoft VC实现了哪些基本上就是所谓的自然对达到指定的大小#pragma组的指令或Zp命令行的选择。这意味着,例如,任何POD类型与一种尺寸小于或等于8字节将根据其大小。什么大将在一个8字节的边界。
如果重要的是,你的控制对不同的处理器和不同的编译器,然后可使用包装尺寸1和垫你的结构。
#pragma pack(push)
#pragma pack(1)
struct Example
{
short data1; // offset 0
short padding1; // offset 2
long data2; // offset 4
};
#pragma pack(pop)
在这个码, padding1
变量只存在,以确保2自然是对齐。
答案a:
是的,这可以很容易导致错位的数据。在一个x86处理,这不会真的伤害了太多的。在其他的处理器,这可能导致碰撞或者非常缓慢的执行。例如,阿尔法处理器,将引发一个处理除外,它会被抓到的操作系统。OS会然后检查的指示,然后做的工作需要处理的不对准数据。然后继续执行。的 __unaligned
关键词可以用在VC标记不对齐访问非x86程序(即为CE)。
其他提示
通过默认,是的。然而,它可以改变通过的pack()#杂注。
我不相信C++标准作出的任何要求在这方面,以及留给了实施。
C和C++不授权任何种类的取向。但是,自然对准的是强烈的首选的和x86 需要 通过大多数其他的CPU系结构,并编译器,通常尽最大努力保持Cpu高兴。因此,在实践中,你会看不到一个编译器产生未数据,除非你真的扭转它的胳膊。
是的,各种类型总结盟至少对准他们的要求。
怎么会这样呢?
但注意,sizeof()一个类型是不同的,因为它是对准。
你可以用下面的宏确定对准要求的一个类型:
#define ALIGNMENT_OF( t ) offsetof( struct { char x; t test; }, test )
取决于编译器,杂注和优化水平。有现代化的汇编者你也可以选择时间或空间的优化,这可能改变准的类型。
通常这将是因为读写,它是更快的方式。但几乎每一个编译器有关把这个关闭。在海湾合作委员会,其中伤-???.与的聚集体,他们一般都对准和尺寸的基础上对准要求的每一个元件内。