首页 > 解决方案 > 为什么 32 位和 64 位系统上的“对齐”相同?

问题描述

我想知道编译器是否会在 32 位和 64 位系统上使用不同的填充,所以我在一个简单的 VS2019 C++ 控制台项目中编写了以下代码:

struct Z
{
    char s;
    __int64 i;
};

int main()
{
    std::cout << sizeof(Z) <<"\n"; 
}

我对每个“平台”设置的期望:

x86: 12
X64: 16

实际结果:

x86: 16
X64: 16

由于 x86 上的内存字大小为 4 个字节,这意味着它必须将字节存储i在两个不同的字中。所以我认为编译器会这样填充:

struct Z
{
    char s;
    char _pad[3];
    __int64 i;
};

那么我可以知道这背后的原因是什么吗?

  1. 为了与 64 位系统向前兼容?
  2. 由于在 32 位处理器上支持 64 位数字的限制?

标签: c++visual-c++32bit-64bitmemory-alignmentabi

解决方案


填充不是由字长决定的,而是由每种数据类型的对齐方式决定的。

在大多数情况下,对齐要求等于类型的大小。因此,对于像您这样的 64 位类型,int64您将获得 8 字节(64 位)对齐。需要将填充插入到结构中,以确保该类型的存储最终位于正确对齐的地址处。

当在两种架构上使用具有不同大小的内置数据类型时,您可能会看到 32 位和 64 位之间的填充差异,例如指针类型 ( int*)。


推荐阅读