如何根据 C++ 标准访问对象表示?

2023-11-29

如何访问对象表示?为了回答这个问题,我将其分为两个问题:

1. 如何获得对象表示的指针?

根据标准,我看不到任何方法来获取指向对象表示。人们经常建议这样实现:

some_type obj{};
const char * rep = reinterpret_cast<const unsigned char*>(&obj);

然而,标准中并没有说object和它的对象表示 are 指针可互换。为什么标准允许这个代码?

2. 我们是否可以认为对象表示在对象初始化时也被初始化?

some_type obj{};
const char * rep = reinterpret_cast<const unsigned char*>(&obj);
char x = rep[0] + rep[1];

Here obj是默认初始化的。编译器如何解释rep[0],它是一个不确定值,或者可能取决于在期间初始化了哪些内存字节obj初始化?


1)你的方法有效:

与...一起工作const指针确保常量不会被抛弃:

5.2.10/2reinterpret_cast 运算符不应放弃常量性。

指针转换是安全的,因为char没有比以下更严格的对齐要求some_type,以便您可以转换rep回到一个some_type*:

5.2.10/7对象指针可以显式转换为不同类型的对象指针。 (...) 转换类型的纯右值 “指向 T1 的指针”到“指向 T2 的指针”类型(其中 T1 和 T2 是 对象类型并且没有 T2 的对齐要求 比 T1 更严格)并返回其原始类型,得出 原始指针值。

Edit:根据我的理解,指向对象的指针和指向其表示的指针之间的相互转换是毫无疑问的:

1.8/6:除非对象是位域或大小为零的基类子对象,否则该对象的地址是第一个对象的地址 它占用的字节。

3.9/4:T 类型对象的对象表示是序列N 个 unsigned char 对象被物体占据T 型, 其中 N 等于 sizeof(T)。

据我所知,“占用”是“占用”的同义词。另请注意,&运营商保证:

5.3.1/3:(...) 如果表达式的类型为 T,则结果的类型为“指向 T 的指针”,并且是纯右值,即 指定对象

2) 对象表示用对象初始化:

这是从值表示的定义以及内存模型和对象生命周期中得出的。

但是,您的示例更复杂:

  • rep[0]尽管有此属性,但如果它仅由填充位组成,则可能仍然是一个未确定的值。您的示例就是这种情况,因为该对象的大小至少为 1,但由于其中没有成员,因此值表示形式为空。
  • rep[1]可以是未定义的行为,如果sizeof(some_type)<2因为取消引用传递数组最后一个元素的指针是 UB。

3)对象表示是什么(用简单的语言)?

让我们举一个简单的例子:

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

在谈论对象占用的内存时存在歧义:

  • 是否只是与其类型相对应的固定大小的连续内存(即int, some size_t字符串的长度和一些指向字符串中字符的指针,就像在 C 中所做的那样)?
  • 或者是存储在对象内存中的所有值,包括存储在其他地方分配的内存位置中的某些值(例如,还有存储字符串值所需的字节)?

The 对象表示对应第一部分。对于不可简单复制的对象,对象表示形式是不够的(即在我们的示例中,存储在字符串中的字节不一定是对象表示形式的一部分)。

The 价值表示对应于第二部分(并且包括存储字符串值所需的字节)。

简单来说,这意味着对象的地址is其表示的地址,但对象表示可能包含填充,并且可能不足以保存属于该对象的每个数据。

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

如何根据 C++ 标准访问对象表示? 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 开启个人热点?

    有没有办法可以使用 Objective C 打开个人热点 我需要连接到打印机 并且不希望用户转到设置然后将其打开 而是想在代码中打开它 打印 然后将其关闭 抱歉 在已发布的 API 中无法执行此操作 您可能需要在以下地址提交增强请求 htt
  • 什么会导致我的源文件变灰,文件图标上有删除线?

    我正在尝试使用 Eclipse Mars 为 STM32F4 Discovery 板构建应用程序 我特别想使用 SPI 库 我已在主程序中包含相应的头文件 但收到错误消息 指出我尝试使用的函数未定义 稍微戳了一下 我意识到该项目的大部分源文
  • 有没有办法预先泄漏和取消泄漏值?

    我目前正在研究用数组做更多的事情 但我认为如果我们被允许以某种方式转变为一个 这些操作的性能可能会更好Leaked
  • erf(x) 和 math.h

    根据这个网站误差函数 erf x 来自 math h 但实际查看 math h 时 它不存在 并且 gcc 无法编译以下测试程序 而 g 可以 include
  • 切换到 18.x 后,Lambda 函数无法加载 AWS sdk

    我将 Lambda 函数从 node12 x 升级到了 node18 x 该代码在 12 x 上运行得很好 切换到 18 x 后 我无法再包含 AWS sdk 我曾经通过简单地输入以下内容来包含它 var AWS require aws s
  • 在 DialogFragment 中使用适配器时软键盘不显示

    我有一个自定义的 DialogFragment 其中有一个 ArrayAdapter 其中有一些 editText 当显示对话框时 即使我按下编辑文本 软键盘也不会出现 编辑文本确实获得焦点 但键盘永远不会出现 如果我不使用适配器而只使用带
  • 解析 Common Lisp 列表中的符号

    假设我有一个函数 CL USER gt defun trimmer seq This trims seq and returns a list cdr butlast seq TRIMMER CL USER gt trimmer 1 2 3
  • 自定义 UITabBar 图标 iOS

    我正在开发一个选项卡式应用程序 我想集成自定义 UITabbar 背景和图标 我已经插入了自定义背景 但图标有问题 图标应该是这样的 但是在故事板中为每个视图添加图标后 我得到如下灰色图标 有谁知道为什么图标以这种方式显示 非常感谢 使用
  • 不明白错误读取不正确的权限

    我正在尝试使用 pyautogui 为游戏制作一个机器人 但是当这行代码运行时 if py locateOnScreen r C Users molta Documents Pythons Poison png None 它返回此错误 OS
  • WebSphere Liberty Profile:未找到上下文根

    我似乎无法在本地工作 即使相同的 WAR 在远程服务器上工作 当我在本地访问我的应用程序时 出现 找不到上下文根 错误 Liberty 配置文件版本为 8 5 5 5 以下是相关文件 服务器 xml
  • 使用单个ajax请求渲染json数据和部分视图

    下面给出的代码向控制器发送 ajax 请求 if btid 01 var allData sessionName sessionname val foundStudent studentId val code btid var mySess
  • 如何合并主分支和主分支?

    大约一个月前 我创建了一个 git 存储库 其中主分支称为 master 几天前 当我尝试提交并推送到同一个存储库时 它将我的更改推送到 master 分支 但我收到一条消息 说主分支已更改为 main 分支 我尝试过合并 但收到一条错误消
  • ReferenceError:找不到变量:__DEV__ [重复]

    这个问题在这里已经有答案了 当我启动我的项目时 我得到了ReferenceError Can t find variable DEV 错误 我已经注释掉了几乎所有代码 现在只有这个 import React Component Text f
  • 如何使用 pyusb 与该设备通信?

    我有一个 Netware uniFlow 设备 当我插入它时 它会显示在 dmesg 中 2962 369905 usb 2 1 4 new full speed USB device number 11 using ehci pci 29
  • 使用 Intel Core 2 Duo E8500 CPU 的 CL_DEVICE_NOT_AVAILABLE

    我收到错误CL DEVICE NOT AVAILABLE跑步时这个示例代码 然而 与该问题不同的是 我的 CPU Intel Core 2 Duo E8500 CPU 似乎是支持的 我已确保链接到 Intel 版本的 OpenCL 库 因为
  • 使用paint时如何在WinForms中实现垂直和水平滚动条?

    在我的代码中 我绘制了一个矩形 通常该矩形对于屏幕来说太大了 即使最大化也是如此 我已经设置了表单属性AutoScroll为 true 这似乎没有任何作用 我的表单上除了矩形绘画之外不会有任何其他内容 我如何实现垂直和水平滚动 Printi
  • 为什么这个谓词留下一个选择点?

    我写了以下谓词 list withoutlast Last forget the last element list withoutlast First Second List First WithoutLast list withoutl
  • 是否有用于 PDF 元数据的 NPM 模块?

    我正在寻找一个npm模块 我可以用它来编辑元标签 例如Author and TitlePDF 文件 或者 开放许可的 JavaScript 库也可以 有一个程序叫pdftk 如果它是一个 这将是合适的npm module 我还没有测试过这个
  • Dart 中的插入符号有什么作用

    我正在查看一些 Flutter 项目 我注意到以下代码 override int get hashCode gt todos hashCode isLoading hashCode 这个 符号在这里做什么 这行代码是在Flutter项目的A
  • 如何根据 C++ 标准访问对象表示?

    如何访问对象表示 为了回答这个问题 我将其分为两个问题 1 如何获得对象表示的指针 根据标准 我看不到任何方法来获取指向对象表示 人们经常建议这样实现 some type obj const char rep reinterpret cas