例如,如果我宣布一个漫长的变量,我可以假设它将始终是对准一个"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 )

取决于编译器,杂注和优化水平。有现代化的汇编者你也可以选择时间或空间的优化,这可能改变准的类型。

通常这将是因为读写,它是更快的方式。但几乎每一个编译器有关把这个关闭。在海湾合作委员会,其中伤-???.与的聚集体,他们一般都对准和尺寸的基础上对准要求的每一个元件内。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top