c++ - POD 类型是否始终对齐?

标签 c++ c visual-c++

例如,如果我声明了一个 long 变量,我是否可以假设它总是在“sizeof(long)”边界上对齐? Microsoft Visual C++ 联机帮助这么说,但这是标准行为吗?

更多信息:

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

char foo[5]

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

显然,#pragma pack() 只影响结构、类和 union 。

MSVC 文档指出 POD 类型与其各自的大小对齐(但它是始终还是默认情况下,它是标准行为,我不知道)

最佳答案

正如其他人所提到的,这不是标准的一部分,而是留给编译器来实现,因为它认为适合所讨论的处理器。例如,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 处理器会抛出处理器异常,操作系统会捕获该异常。然后,操作系统将检查指令,然后执行处理未对齐数据所需的工作。然后继续执行。 __unaligned 关键字可以在 VC 中用于标记非 x86 程序(即 CE)的未对齐访问。

关于c++ - POD 类型是否始终对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/93569/

相关文章:

c++ - += 在没有 boost 的 vector 上

.net - 在 C++ 中测试鼠标左键和右键单击

c - Linux gcc <time.h> 和线程在一起

c++ - FFmpeg -- 使用硬件加速进行视频解码

c++ - 检查 char* 缓冲区是否包含 UTF8 字符?

c++ - 在新选项卡中打开 URL (Internet Explorer)

winapi - 使用 dllexport 从 DLL 导出函数

c++ - 如何在 OpenGL 中绘制单个像素?

c++ - Mutex 没有按预期工作

c++ - 如何在 C++ 中检查 Microsoft Outlook 是否打开?