非平凡可复制类型的 C++ 值表示

2024-03-20

C++ 标准的当前草案(2019 年 3 月)有以下段落([basic.types] p.4)(强调我的):

T 类型对象的对象表示是 T 类型对象占用的 N 个 unsigned char 对象的序列,其中 N 等于 sizeof(T)。 T 类型对象的值表示是参与表示 T 类型值的一组位。 对象表示中不属于值表示的位是填充位。对于普通可复制类型,值表示是对象表示中确定值的一组位,该值是实现定义的一组值的一个离散元素.

为什么突出显示的句子仅限于可以简单地复制类型?是因为一些位值表示 of a 不可平凡复制对象可能在其之外对象表示? 这个答案 https://stackoverflow.com/a/46736040/3766405, 也this one https://stackoverflow.com/a/12773681/3766405暗示这个。

然而,在上面链接的答案中,概念性的value对象的语义基于用户引入的语义。在第一个链接答案的示例中:

class some_other_type
{
    int a;
    std::string s;
};

用户决定value类型对象的some_other_type包括属于字符串的字符s.

我试图想一些例子,说明对象的某些部分(不是可以简单地复制) 值表示都在其之外对象表示是隐式的(实现必须这样做,不是由用户随意决定的)。

我想到的一个例子是值表示具有虚方法的基类子对象可以包括来自对象表示它所属的完整对象的属性,因为与它本身是完整对象的情况相比,基类子对象的行为可能不同(可能“具有不同的值”)。

我想到的另一个例子是vtable也可能是其中的一部分值表示的对象的虚拟表指针指向它。

这些例子正确吗?还有其他例子吗?

标准委员会引入突出显示的句子是因为对象的语义“值”可能由用户决定(如两个链接的答案中所示),还是因为实现可能决定(或者可能是)被迫)这样做,或两者兼而有之?

谢谢。


按照我的理解,你强调的这句话的重点是这一部分:

对于普通可复制类型,值表示是一组位在对象表示中它确定一个值,该值是实现定义的一组值的一个离散元素。

本质上,标准的 [basic.types]#4 表示“每个对象都有一组位O这是它的对象表示和一组作为其值表示的位V。套装P = O without V是填充位。对于普通可复制类型,V是一个子集O”。后者很重要,因为它意味着围绕O位组也可以安全地复制V对于普通可复制类型,因此保留该值。你如何定义V对于其他类型在这里无关紧要(如果需要,请将其设置为整个抽象机)。


回答评论中提出的修改后的问题:

如果 1110000100010001111 是不可平凡复制对象的对象表示,为什么实现不能告诉它意味着什么?是否因为还有一些其他位(在此对象表示之外)可以帮助确定对象具有什么值?

让我们来std::string举个例子。它不是可简单复制的,因为它必须处理内存管理。

If two std::string对象具有相同的位模式,它们意味着相同的事情吗?

没有。有至少一个实现 https://stackoverflow.com/questions/55181063/weird-behavior-in-struct-destruction/55182495#55182495通过使其缓冲区指针指向自身(gcc)来指示小字符串优化。销毁后,当(且仅当)缓冲区未指向该确切位置时,缓冲区才会被释放。

显然,两个std::string驻留在不同位置的对象必须(在此实现中)表示相同的(小)字符串值不同的位模式(缓冲区指针必须不同)。更重要的是,两个对象中的相同位模式可能意味着非常不同的事情 - 它可能在一种情况下指示 SSO,但在另一种情况下则不然。

正如您所看到的,每个值的表示都有附加信息参与std::string这里:它在内存中的位置(即this)。标准没有进一步规定如何用位来表示。

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

非平凡可复制类型的 C++ 值表示 的相关文章

随机推荐

  • 从封闭的模板类推导返回类型时,函数解析失败

    我一直在尝试为定点类型实现一个复数类 其中乘法运算的结果类型将是输入类型的函数 我需要有一些函数 可以将复数乘以复数 也可以将复数乘以实数 这本质上是代码的简化版本 其中 A 是我的复杂类型 template
  • Java:检测对于 JSON 不正确的控制字符

    我正在重新发明轮子并用 Java 创建我自己的 JSON 解析方法 我正在查看 非常好 文档json org http www json org 我唯一不确定的部分是它说的地方 或控制字符 由于文档非常清晰 并且 JSON 非常简单且易于实
  • Angular 模块与库

    太棒了 Angular 已经发布了版本 6 并且 CLI 提供了生成库的选项 他们称之为 备受期待的功能 现在 从商业角度来看 我想知道 为什么你实际上需要这个 为什么在现有项目中而不是可以像往常一样通过 npm 安装的单独项目 如果您希望
  • 如何通过设置类来格式化 jsTree 中的“li”和“a”DOM 元素?

    基本上 我有一个 jsTree 我需要格式化它li and a通过向每种类型添加自定义类来实现 DOM 元素 文档不清楚如何执行此操作 据我所知 无法添加自定义类 任何格式都必须通过覆盖 jquery 主题或编辑 jsTree 源代码来实现
  • 只能在草稿应用程序上创建状态为草稿的版本

    我正在使用 Jenkins AndroidAPKUpload 插件 我在 Play 商店中有一个应用程序的草稿版本 该应用程序仅用于内部测试 永远不会向公众发布 我认为这意味着它将永远是一个草案 当我尝试通过插件上传 APK 时 我收到错误
  • hibernate使用注释或使用hibernate配置文件

    我看过很多使用注释 基本上是hibernate注释或JPA注释 来实现hibernate的教程 有教程主要关注使用hibernate配置文件 hbm xml文件 根本没有使用注释 现在我有点困惑 哪种方法更好 我绝对更喜欢使用注释来定义我的
  • sinon 存根 withArgs 可以匹配部分参数但不是全部参数

    我有一个正在存根的函数 该函数会使用多个参数进行调用 我想检查一下只是第一个参数 其余的都是回调函数 所以我不想管它们 因此 我可能有以下 2 个调用 以 ajax 为例 method get sinon stub method get 2
  • Groovy HTTPBuilder:从 GZIPed 分块响应中获取实体内容

    我需要向 Web 服务器发送 POST 请求 并能够读取该服务器发送的响应 我尝试使用 HTTPBuilder lib 和以下代码 def http new HTTPBuilder http myServer http setProxy P
  • 更改 Laravel 5.2 中的登录/注册 URL

    我目前正在编写一个应用程序 该应用程序仅包含公司员工的帐户 而不包含常规网站访问者的帐户 因此 我想将与网站 管理 区域相关的 URL 保留在 admin URL 下 这意味着更改 login to admin login and regi
  • 获取一个 url 参数的数组

    我想获取 url param id 但它不起作用 这里每个人都可以帮助我吗 下面的代码不起作用 Url http localhost 9000 rest alerts ids 123 ids 456 路由配置文件 GET restws al
  • Excel-VBA:需要变量声明吗?

    如果写下面的代码会不会出错 Sub Something Dim i As integer Dim xRange As Range Dim yRange As Range Set xRange Range x table Set yRange
  • 控制 R 散点图中点的大小?

    在 R 中 plot 函数需要一个pch控制图中点的外观的参数 我正在制作具有数万个点的散点图 并且更喜欢一个小但不是太小的点 基本上 我发现pch 太小了 但是pch 19太胖了 中间有什么东西或者有什么方法可以以某种方式缩小这些点吗 A
  • 自定义 ASP.NET 身份

    我正在使用 Identity Server 4 并且已自定义 ASP NET Identity 用户 如下所示 public class ApplicationUser IdentityUser MaxLength 100 public v
  • Java 默认版本在 PATH 更改后不反映

    我当前正在 Java 1 7 0 17 64 位版本上运行 我想使用 Java 32 位版本启动一个应用程序 我更新了 PATH 变量以指向 C Program Files x86 Java jre7 bin Java 32 位版本 然后做
  • 如何在不设置内置错误的情况下触发 mat-date-range-input 的 mat-form-field 中 mat-error 的显示?

    根据问题 我有一个日期范围选择器start and end日期作为mat form field 我想执行自定义验证 例如 确保之间的绝对差异start and end不超过 15 天 并显示mat error在 的里面mat form fi
  • Groovy - 如何延迟 Groovlet 修改重新编译检查

    我是 Groovy 的新手 我正在考虑使用 Groovlets 不是 GRAILS 来替换一些 Servlet 如果我更改 Groovlet 的脚本文件 Groovlet 会重新编译并自动获取更改 包括从 Groovlet 引用的脚本 这对
  • 具有离散值的圆形 SeekBar

    我正在尝试创建一个具有离散非线性值的圆形搜索栏 我还希望这些值出现在圆圈之外 我从 GitHub 上查看了多个版本 其中最有希望的是JesusM https github com JesusM HoloCircleSeekBar但是 我想不
  • Emacs 是否可以运行位于远程服务器上的 Matlab shell?

    我希望能够使用 Matlab 模式 matlab el 来运行 matlab shell 唯一的问题是 Matlab 位于远程主机上 这可能吗 如果是这样 请解释一下 我现在正在和流浪汉玩 但没有成功 Thanks 我刚刚尝试通过 ssh
  • Task.Factory.StartNew 与 Task.Factory.FromAsync

    假设我们有一个 I O 绑定方法 例如进行数据库调用的方法 该方法可以同步和异步运行 那是 Sync IOMethod Async BeginIOMethod EndIOMethod 那么当我们以如下所示的不同方式执行该方法时 在资源利用率
  • 非平凡可复制类型的 C++ 值表示

    C 标准的当前草案 2019 年 3 月 有以下段落 basic types p 4 强调我的 T 类型对象的对象表示是 T 类型对象占用的 N 个 unsigned char 对象的序列 其中 N 等于 sizeof T T 类型对象的值