c++ - 为什么 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;
};
那么我可以知道这背后的原因是什么吗?
- 为了与 64 位系统向前兼容?
- 由于在 32 位处理器上支持 64 位数字的限制?
解决方案
填充不是由字长决定的,而是由每种数据类型的对齐方式决定的。
在大多数情况下,对齐要求等于类型的大小。因此,对于像您这样的 64 位类型,int64
您将获得 8 字节(64 位)对齐。需要将填充插入到结构中,以确保该类型的存储最终位于正确对齐的地址处。
当在两种架构上使用具有不同大小的内置数据类型时,您可能会看到 32 位和 64 位之间的填充差异,例如指针类型 ( int*
)。
推荐阅读
- ios - 在 Swift 中从多个 ViewController 收集数据
- python - 没有模块名称 MySQLdb
- php - FCM 推送通知 API 中的流明错误
- java - java如何处理八进制和十进制数
- opencart-3 - 如何在opencart 3中更改特色标题名称
- sublimetext3 - 在 Sublime Text 3 中显示 NUL 字符
- python - Tensorflow:每个测试数据的多标签分类预测都是相同的
- scala - 在scala中应用条件修剪平均值
- python - GAE Cloud Datastore:获取最常编写的模型
- java - org.postgresql.Driver 在 NetBeans 中不起作用