POD 结构或标准布局类型的成员是否保证根据其对齐要求进行对齐?

2024-05-16

给定一个 POD 结构(在 C++03 中)或一个标准布局类型(在 C++11 中),所有成员都有基本对齐要求,是否可以保证每个成员都根据其对齐要求进行对齐?

换句话说,对于所有成员m_k in { m0 ... mn标准布局类型的}S,

struct S {
    T0 m0;
    T1 m1;
    ...
    TN mn;
};

下面的表达式保证计算结果为true?

(offsetof(S,m_k) % alignof(decltype(S::m_k))) == 0

请给出 C++03 和 C++11 的答案并引用标准的相关部分。来自 C 标准的支持证据也会有所帮助。


我对 C++03 标准 (ISO/IEC 14882:2003(E)) 的解读是,除了第一个成员之外,它对 POD 结构内成员的对齐保持沉默。相关段落是:

在规范的语言中,object是一个“存储区域”:

1.8 C++对象模型[intro.object]

1.8/1 C++ 程序中的构造创建、销毁、引用、访问和操作对象。对象是一个存储区域。 ...

对象根据其对齐要求进行分配:

3.9 类型[基本类型]

3.9/5 对象类型有对齐要求(3.9.1、3.9.2)。完整对象类型的对齐方式是一个实现定义的表示字节数的整数值;对象被分配到满足其对象类型对齐要求的地址。

基本类型有对齐要求:

3.9.1 基本类型 [basic.fundamental]

3.9.1/3 对于每个有符号整数类型,都存在一个对应的(但不同的)无符号整数类型:“unsigned char”、“unsigned Short int”、“unsigned int”和“unsigned long int”,每个类型占用相同的存储空间并与相应的有符号整数类型具有相同的对齐要求(3.9);...

Padding may由于“实现对齐要求”而发生:

9.2 类成员[class.mem]

9.2/12 声明的(非联合)类的非静态数据成员在没有介入访问说明符的情况下进行分配,以便后面的成员在类对象中具有更高的地址。非静态的分配顺序 由访问说明符分隔的数据成员未指定(11.1)。实现对齐要求可能会导致两个相邻成员不能立即分配;管理虚拟函数 (10.3) 和虚拟基类 (10.1) 的空间要求也可能如此。

9.2/12 中的“分配”一词与 3.9/5 中的“分配”含义相同吗?规范中大多数使用“分配”是指动态存储分配,而不是结构内部布局。指某东西的用途may9.2/12 中的内容似乎暗示 3.9/5 和 3.9.1/3 的对齐要求对于结构成员可能并不严格要求。

POD 结构体的第一个成员将根据结构体的对齐要求进行对齐:

9.2/17 指向 POD 结构对象的指针(使用 reinterpret_cast 进行适当转换)指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。 [注意:因此,POD 结构对象内可能存在未命名的填充,但在其开头处不存在,这是实现适当对齐所必需的。 ]

[以上所有引文中都添加了强调。]


POD 结构体的每个元素本身就是一个对象,并且只能根据这些对象的对齐要求来分配对象。不过,由于某个对象是另一个对象的子对象 ([basic.align]/1, 2:

1 对象类型有对齐要求(3.9.1, 3.9.2) 对可以分配该类型的对象的地址施加限制。一个结盟是一个实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数。对象类型对该类型的每个对象施加对齐要求;可以使用对齐说明符 (7.6.2) 来请求更严格的对齐。

2 A 基本对齐由小于或等于所有上下文中实现支持的最大对齐的对齐表示,该对齐等于alignof(std::max_align_t)(18.2)。当类型用作完整对象的类型和用作子对象的类型时,类型所需的对齐可能不同. [Example:

struct B { long double d; };
struct D : virtual B { char c; }

When D是一个完整对象的类型,它将有一个类型的子对象B,因此必须适当对齐long double. If D显示为另一个对象的子对象,该对象也具有B作为虚拟基类,B子对象可能是不同子对象的一部分,从而减少了对齐要求D子对象。—结束示例 ] 结果alignof运算符反映了类型中的对齐要求 完整对象的情况。

[已添加强调]

虽然示例通过继承引用子对象,但规范性措辞通常仅引用子对象,因此我相信相同的规则适用,因此一方面can假设每个子对象都对齐以便可以访问。另一方面,没有你can't必然假设将与alignof给你。

[参考来自 N4296,但我相信这同样适用于所有最新版本。 C++98/03当然没有alignof根本没有,但我相信相同的基本原则适用 - 成员将对齐以便可以使用它们,但对齐要求不一定与它们用作独立对象时相同。]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POD 结构或标准布局类型的成员是否保证根据其对齐要求进行对齐? 的相关文章

  • ScrollableControl 在整个控件周围绘制边框

    我正在构建基于的自定义用户控件ScrollableControl 现在我正在尝试在控件周围添加边框 类似于 DataGridView 的边框 我可以使用以下方法绘制边框 e Graphics TranslateTransform AutoS
  • 如何有效地测试action是否用属性(AuthorizeAttribute)修饰?

    我正在使用 MVC 并且有一种情况OnActionExecuting 我需要确定即将执行的Action方法是否用属性修饰 AuthorizeAttribute尤其 我不是问授权是否成功 失败 而是问该方法是否需要授权 对于非 MVC 人员
  • 忽略父进程中的信号

    我正在尝试实现一个 shell 程序 我希望 shell 程序忽略 SIG INT ctrl c 但在我的程序中 子进程也会忽略 SIG INT 信号 但它不应该这样做 因为 exec 应该将子进程带到另一个程序 并且该程序默认情况下应该处
  • 从 C# 访问 COM vtable

    C 中有没有办法访问 COM 对象的虚拟方法表以获取函数的地址 经过大量搜索和拼凑不同的部分解决方案后 我弄清楚了如何做到这一点 首先 您需要为您尝试访问的对象定义 COM 组件类 ComImport Guid InterfaceType
  • 有没有办法使用 ews c# 确定电子邮件是否是回复/响应?

    我正在编写一个支持系统 这是我第一次使用 EWS 到目前为止 我已经相当成功了 我可以提取我需要的信息 发送电子邮件 一切正常 我确实有点头疼 有没有办法判断电子邮件是否实际上是回复 该应用程序的基本思想是有人发送电子邮件 我们回复并给他们
  • std::string substr 方法问题

    你好 我正在写这个方法 我希望它从给定缓冲区中提取给定位置的一部分 我有一个像这样的字符串something one something two我想要得到 一个 这是我的想法 static std string Utils getHeade
  • C#:如何确定坐标是否在美国大陆?

    我正在获取坐标 纬度 经度 我想检查这些坐标是否位于美国大陆 有没有一种简单的方法可以在 C 中实现 我可以将坐标转换为 MGRS 或 UTM 谢谢 哇哦 他们专门为你准备了 http econym org uk gmap states x
  • 使用标准范围连接带有分隔符的字符串范围

    我想使用范围将跨度中包含的四个字节转换为字符串 这是输入和输出的示例 std span
  • 隐式转换和编译器的不同行为

    Motivated by this question https stackoverflow com q 51972738 5800831 I created the following code struct X X int struct
  • 不使用 DAO 压缩 Microsoft Access 数据库

    我用CDatabase类开一个ACCDB访问数据库 司机是 T Microsoft Access Driver mdb accdb 我可以打开并使用数据库 已经这样做很多年了 if DatabaseExist m strMDBPath AJ
  • 如何检查我的程序是否有数据通过管道传输到其中

    我正在编写一个应该通过标准输入读取输入的程序 所以我有以下结构 FILE fp stdin 但是 如果用户没有将任何内容通过管道传输到程序中 这就会挂起 我如何检查用户是否确实将数据通过管道传输到我的程序中 例如 gunzip c file
  • 如何声明返回相同类型的 Func Delegate 的 Func Delegate?

    我想编写一个方法 该方法可以完成一些工作 并最终返回另一个与原始方法具有相同签名的方法 这个想法是根据前一个字节值顺序处理字节流 而不进行递归 通过这样调用它 MyDelegate executeMethod handleFirstByte
  • 从 ASP.NET Web API 返回 HTML

    如何从 ASP NET MVC Web API 控制器返回 HTML 我尝试了下面的代码 但由于未定义 Response Write 而出现编译错误 public class MyController ApiController HttpP
  • ASP Net Core 属性路由和双正斜杠

    正如所指出的here https stackoverflow com a 20524044 3129340 URL 中包含双斜杠是有效的 我有一个使用属性路由的 ASP Net Core 项目 一个名为GroupController用于处理
  • ld: 无法对非 PE 输出文件执行 PE 操作错误

    我是操作系统编程的新手 我正在读一本书 其中给出了一个简单的内核示例 如下所示 main char video memory 0xb8000 video memory X 为了编译这个名为 kernel c 的文件 我在 Windows 7
  • 如何获取 EF 中的实体更改增量?

    我只需要获取已更改字段的列表 数据存储区是 ssce 因此没有可用的触发器 EF 是否支持获取列表或构建通用组件 根据上下文的类型和生成的实体 您可以通过多种不同的方式来完成此操作 如果对象继承自 Entity 或 POCO 您可以使用Ob
  • GCC编译非常慢(文件大)

    我正在尝试编译一个大的 C 文件 专门用于 MATLAB mexing C 文件大约 20 MB 可用来自 GCC 错误跟踪器 https gcc gnu org bugzilla attachment cgi id 36632如果你想玩一
  • TransactionScope 在某些机器上自动升级到 MSDTC?

    在我们的项目中 我们使用 TransactionScope 来确保我们的数据访问层在事务中执行其操作 我们的目标是not要求在我们的最终用户的计算机上启用 MSDTC 服务 问题是 在我们一半的开发人员机器上 我们可以在禁用 MSDTC 的
  • 删除指针后将其设为 NULL 是一个好习惯吗?

    我首先要说的是 使用智能指针 您将永远不必担心这个问题 下面的代码有什么问题 Foo p new Foo use p delete p p NULL 这是由答案和评论 https stackoverflow com questions 19
  • 从 C# 应用程序调用 ASP.net Web 服务

    我有个问题 我如何调用 Web 服务并从 C 桌面应用程序获取结果 我正在制作一个桌面应用程序 我希望它能够连接到我的在线 ASP net Web 服务 这怎么可能 在 解决方案资源管理器 中 右键单击项目节点并选择 添加 Service参

随机推荐

  • Highcharts - 使用选定的饼图切片获得 3D 效果

    在 highcharts 中 我试图使当用户选择或将鼠标悬停在饼图的切片上时 该切片会产生沿 z 轴 朝向用户 上升的效果 我试图通过 css 设置阴影过滤器并使切片的边框更宽 填充颜色相同 来实现此目的 然而 我面临的问题是切片仍然可以位
  • Apache Camel POJO Bean 处理器单例还是原型?

    我使用 Camel 的 spring DSL 来构建路由 并使用 POJO bean 作为处理器 最初 我这样做
  • Node.js:读取 URL 中传递的参数

    在 Rails 中 我向服务器发出 POST 请求 response Typhoeus Request post http url localtunnel com request from ola to ole result JSON pa
  • Scrapy - 使用 TwistedScheduler 时出现 ReactorAlreadyInstalledError

    我有以下 Python 代码来启动 APScheduler TwistedScheduler cronjob 来启动蜘蛛 使用一只蜘蛛不是问题 而且效果很好 然而 使用两个蜘蛛会导致错误 twisted internet error Rea
  • 在 Xcode 6 中定位 iOS 7.1 或 7.0 时,应用程序中出现黑条

    重现步骤 使用Xcode6创建一个新项目 单视图模板 仅限iPhone Objective C 导航到项目设置并将部署目标从 8 0 更改为 7 1 在安装了 7 1 的 iPhone5 S 或 iPhone5 s 7 1 模拟器中运行应用
  • 使用 Moq 测试接受委托的方法

    我的代码正在使用一个实现这样的接口的组件 public interface IFoo void DoSomething string p1 void DoSomething string p1 Action
  • jqGrid过滤

    我想在我的中实现过滤jqGrid http www trirand com jqgridwiki doku php id start in my Spring框架MVC http en wikipedia org wiki Spring F
  • 获取空对象的基础类型[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions User x null object
  • 什么时候应该使用双精度而不是十进制?

    我可以说出使用的三个优点double or float 代替decimal 使用更少的内存 速度更快 因为处理器本身支持浮点数学运算 可以表示更大范围的数字 但这些优点似乎只适用于计算密集型操作 例如建模软件中的操作 当然 当需要精度时 例
  • 如何使用 PHP 查找目录中的前 5 个文件?

    如何使用 PHP 列出按字母顺序排序的目录中的前 5 个文件或目录 Using scandir array slice array filter scandir path to dir is file 0 5 The array filte
  • ASP.NET MVC:将表单 POST 绑定到参数时避免紧密耦合

    假设我有一个像这样的界面 interface IThing int Id get set string Title get set 在 ASP NET MVC 中 我有一个表单可以发布到控制器操作 如下所示 AcceptVerbs Http
  • 如何使用 SSIS 将多个 Access 数据库导入到 SQL Server

    我有一个文件夹 其中包含 300 多个 Access 数据库 由我无法控制的程序编写 它们都有相同的结构 只是一张表 我正在将数据导入到 SQL Server 2005 中的表中 使用导入向导效果很好 但它一次只能用于一个 Access 数
  • 最简单的 Ajax 照片库

    我不认为 最简单 是主观的 寻找一个可托管的照片库 除了显示图像并提供 下一张图像 和 上一张图像 之外什么也不做 但所有这些都无需重新加载页面 显然预缓存也很好 PHP Python Ruby 或 JS 如果你想要简单的 也许是这样的 d
  • RecyclerView 未显示列表中的所有项目

    我在用RecyclerView在我的应用程序中 每次我打开屏幕时 我只能看到一项 但当我调试时 它每次都会出现onBindViewHolder method 这是我的适配器 Override public ViewHolder onCrea
  • PHP语言问题

    我有一个 php 页面 它将邮件发送到特定电子邮件 其中包含此页面表单中的数据 邮件必须以网站的母语 阿拉伯语 发送 但是当我单击表单上的提交按钮时 收到的邮件一半可读 阿拉伯语 另一部分不可读 符号 我想知道如何解决这个问题并且能够发送邮
  • JSP:未评估 EL 表达式[重复]

    这个问题在这里已经有答案了 我有一个在 Tomcat 5 5 上运行的 JSP 页面 我有以下代码
  • BufferedInputStream 的使用

    让我在这篇文章的序言中提出一点警告 对于 Java 来说 我完全是个初学者 我断断续续地编写 PHP 有一段时间了 但我准备制作一个桌面应用程序 因此出于各种原因我决定使用 Java 我正在开发的应用程序处于开始阶段 少于 5 个类 我需要
  • JPA 和 PostqreSQL:长字符串持久化

    谁能告诉我如何使用 JPA 保存长文本 我使用 PostgreSQL 这是我在类中定义很长字符串的方法 Lob private String body 然而 这会产生一个类型的字段字符变化 255 在数据库中 此外 我尝试使用 Column
  • Airflow 默认连接数过多

    我打开气流并检查连接 发现其后面运行的连接太多 关于如何杀死那些我不使用的任何想法 或者我很想知道运行它的最小 conn id 建筑学 LocalExecutor 与其他经纪人不同 Postgres 作为元数据库 但它列出了 17 个连接
  • POD 结构或标准布局类型的成员是否保证根据其对齐要求进行对齐?

    给定一个 POD 结构 在 C 03 中 或一个标准布局类型 在 C 11 中 所有成员都有基本对齐要求 是否可以保证每个成员都根据其对齐要求进行对齐 换句话说 对于所有成员m k in m0 mn标准布局类型的 S struct S T0