当前位置:  开发笔记 > 编程语言 > 正文

POD类型是否始终对齐?

如何解决《POD类型是否始终对齐?》经验,为你挑选了1个好方法。

例如,如果我声明一个长变量,我可以假设它将始终在"sizeof(long)"边界上对齐吗?Microsoft Visual C++在线帮助是这样说的,但它是标准行为吗?

更多信息:

一个.可以明确地创建一个未对齐的整数(*bar):

char foo [5]

int*bar =(int*)(&foo [1]);

湾 显然,#pragma pack()只影响结构,类和联合.

C.MSVC文档声明POD类型与它们各自的大小对齐(但它总是或默认情况下,它是标准行为,我不知道)



1> Torlack..:

正如其他人所提到的,这不是标准的一部分,而是由编译器实现,因为它认为适合于所讨论的处理器.例如,VC可以轻松地为ARM处理器实现与x86处理器不同的对齐要求.

Microsoft VC实现了基本上称为自然对齐的内容,其大小达到#pragma pack指令或/ Zp命令行选项指定的大小.这意味着,例如,任何大小小于或等于8字节的POD类型将根据其大小进行对齐.任何更大的东西都将在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变量仅用于确保data2自然对齐.

回答:

是的,这很容易导致数据错位.在x86处理器上,这根本不会造成太大伤害.在其他处理器上,这可能导致崩溃或执行速度非常慢.例如,Alpha处理器会抛出一个处理器异常,该异常将被操作系统捕获.然后,OS将检查指令,然后执行处理未对齐数据所需的工作.然后执行继续.该__unaligned关键字可以在VC中用于标记非x86程序(即CE)的未对齐访问.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有