c - 在结构中使用 long double 时的对齐
问题描述
我知道一般来说,结构实例将具有其最宽标量成员的对齐方式。我声明了一个具有long double
数据类型成员的结构。
struct try
{
char a;
long double b;
};
struct try obj;
当我试图检查sizeof(obj)
它是作为16
. 我的编译器假定long double
为12
字节。所以我无法理解这里的填充到底是如何完成的,以及结构中的对齐方式是如何发生的。我假设对齐将基于long double
它是最宽的标量成员来完成。因此11
char 应该有一个字节填充,并且结构变量的大小应该输出为24
但输出为16
. 那么这里到底发生了什么?我正在研究64 bit
处理器。
解决方案
首先,即使您有 64 位处理器,您的编译器也会创建 32 位输出。无论如何,您假设事物需要与与其大小相同的边界对齐,这通常不是真的。特别是,在您的情况下,long double
s 占用 12 个字节,但只需要与 4 个字节的边界对齐。因此,在您的 single-byte 之后char
,编译器会插入 3 个字节的填充以达到 4 字节的边界,然后插入您的 12-byte long double
。1+3+12 是 16,所以struct try
是 16 字节长。
推荐阅读
- python-3.x - pyspark 具有现有列字符串条件的新列(带有特殊字符)
- python - Python/Pandas - 我怎样才能只保留外连接的父数据框?
- wpf - 动态资源合并不将样式应用于第一个控件
- android - 为什么在android中单击按钮时编辑文本返回空字符串?
- php - XAMPP-VM for max osx,使用 PHP 7.4.5 找不到 var_input_vars
- javascript - DraggableFlatList 行与普通平面列表一起放置在滚动视图内时会丢失偏移量
- html - 调整窗口大小时,我需要将 div 移到左侧
- javascript - 整个打字稿界面的后备?
- office365 - Microsoft Graph - 我们是否需要特定的 Office365 许可证才能使用 Webhooks?
- javascript - Java Script 排序算法可视化工具