空基类是否应该影响派生类的布局?

2023-12-03

C++ 标准(引用草案 n3242)对子对象 [intro.object] 有如下规定:

除非对象是位域或零的基类子对象 size,该对象的地址是它的第一个字节的地址 占据。两个不同的对象,既不是位域也不是基数 零大小的类子对象应具有不同的地址。

现在,给出以下代码片段:

struct empty { };
struct member: empty { };
struct derived: empty { member m; };

int main(void)
{
    printf("%d", sizeof(derived));
    return 0;
}

gcc 我相信打印出来2,Visual C++ 2010 打印出来1。我怀疑 gcc 采用的标准意味着如果类型代表不同的对象,则不能对类型的存储进行别名。我敢打赌 MSVC 采用的标准意味着如果一个子对象的大小为零,您可以做任何您想做的事情。

这是未指定的行为吗?


扩展我之前的评论:

对象由其地址来标识。如果比较相同类型的两个对象的地址(如指针)并且它们比较相等,则指针被视为指向同一对象。

不同类型的对象不能通过这种方式直接比较,因此允许它们具有相同的地址。一个例子是结构体及其第一个成员。它们不能是同一类型。基类和派生类也不能,因此如果基类为空,它们可能具有相同的地址。

但是,基类和派生类的第一个成员can属于同一类型。这不是问题,除非基类也是空的并且编译器尝试空基类优化。在这种情况下,我们可以将指向同一类型的两个不同对象的指针比较相等,因此相信它们是同一个对象。

因此,如果成员具有不同的类型(空和字符),它们可以具有相同的地址。如果它们属于同一类型,则不能,因为这会破坏对象身份的测试,例如if (this != &that),有时用于测试诸如自我分配之类的事情。

顺便说一句,微软同意这是他们的编译器中的一个错误,但还有其他更紧急的事情需要首先修复。

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

空基类是否应该影响派生类的布局? 的相关文章

  • 强制 const 存储返回的值 value

    这就是我想要实现的目标 struct test const test returnconst return test test returnnonconst return test int main test t1 returnnoncon
  • 实体框架 - sql server 表中未设置默认值

    SQL Server 2005 数据库表有一列 createdon 其默认值设置为 getdate 我正在尝试使用实体框架添加记录 createdon 列未更新 我是否错过了实体框架中的任何属性 请提出建议 这是实体框架存在的少数问题之一
  • 代码块调试问题

    我正在尝试在代码块中运行一个简单的链表程序 但我无法运行该程序并且收到以下错误 Active debugger config GDB CDB debugger Default Building to ensure sources are u
  • 在 std::forward 中它如何接受右值?

    看看斯科特 迈耶的有效的现代 C 第200 201页 建议的简化实施std forward可能是 在其他地方看到了正确的实现 template
  • 本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

    这相当复杂 所以请耐心听我说 我有一个用本机 仅限 Win32 C 编码的第 3 方程序 目标 作为目标设计的一部分 它实现了一个 dll 插件系统 本机 DLL 当放置在程序的 ext 目录中时 由目标加载 然后 目标根据需要调用每个 D
  • 带有 Prism 区域适配器的 AvalonDock

    我看到了一些关于 SO 的问题 但似乎没有一个适合我 我希望能够使用伟大的使用 Prism 4 但是 所有示例区域适配器均适用于 Avalondock 1 x 系列 我无法使其工作 有人有关于如何为 AvalonDock 的 LayoutD
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • 可以轻易移动,但不可轻易复制

    是否可以创建类类型 即 普通移动构造 但不是普通复制构造 但仍然可复制构造 普通复制构造 但不是普通移动构造 但仍然可移动构造 可以简单地复制分配 但不能简单地移动分配 但仍然可以移动分配 可以简单地移动分配 但不能简单地复制分配 但仍然可
  • 将私有部分保留在 C++ 标头之外:纯虚拟基类与 pimpl

    我最近从 Java 和 Ruby 切换回 C 令我惊讶的是 当我更改私有方法的方法签名时 我必须重新编译使用公共接口的文件 因为私有部分也位于 h 文件中 我很快想出了一个解决方案 我想这对于 Java 程序员来说是典型的 接口 纯虚拟基类
  • std::make_shared 作为默认参数无法编译

    在 Visual C 2008 和 2010 中 以下代码无法编译并出现以下错误 include
  • 需要帮助将 winform 迁移到 net 5

    我正在将 winform 应用程序从 net core 3 1 移植到 net 5 并收到以下错误 严重性代码 说明 项目文件行抑制状态 错误NETSDK1136 目标平台必须设置为Windows 通常 通过在 TargetFramewor
  • 在浏览器中测试wcf服务

    我无法在浏览器中调用基本的 wcf web 方法 即使使用
  • 向量和常量

    考虑一下这个 void f vector
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 从资源文件获取 DisplayName [重复]

    这个问题在这里已经有答案了 我在 App GlobalResources 文件夹中有特定于文化的资源文件 现在我需要从此资源文件中读取 DisplayName 属性的值 我在用 Display Name MerchantName Resou
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • { Qt5.0.2/QML/QtQuick2.0/C++ } 运行没有错误的示例项目? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的设置是Qt5 0 2 MinGW 32位 我在寻找 Qt5 0 2 QML QtQuick2 0 C 代码项目示例 不是Qt Qu
  • 为 winforms ComboBox 中的单个项目着色?

    我遇到了一个困境 我有一个表单 其中包含许多组合框 其中包含在某些情况下可能无效 过时的信息 选项 项目 我不能简单地从项目中删除过时的信息 但我确实想在选项无效时为用户提供视觉线索 我正在考虑对项目进行着色 可能是红色 来指示它们是否无效
  • 如何获取打印机设备上下文?

    我在 Windows 上尝试使用以下命令打印增强型图元文件 EMF 播放增强元文件 http msdn microsoft com en us library dd162800 28VS 85 29 aspx 我当前正在使用屏幕上窗口的设备
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • 为什么移动 0 会截断小数?

    我最近发现了这段JavaScript代码 Math random 0x1000000 lt lt 0 我知道第一部分只是生成 0 到 0x1000000 16777216 之间的随机数 但第二部分似乎很奇怪 执行位移 0 有何意义 我不认为
  • 如果我从共享扩展打开包含应用程序,Apple 会拒绝吗?

    我正在使用提供的解决方案here从共享扩展中打开我的内容 尽管它很脆弱 但它似乎没有使用任何私有 API 方式来做到这一点 如果我使用我的应用程序 Apple 会拒绝它吗 有人拥有经过批准的应用程序 可以从共享扩展中打开包含应用程序的应用程
  • MySQL:截断表与从表中删除

    我们什么时候使用DELETE命令与TRUNCATE命令 我试图在互联网上查找 但两个命令都删除了数据 我看不出有什么区别 从表中删除 1 DELETE is a DML Command 2 DELETE statement is execu
  • F# 返回 ICollection

    我正在使用用 C 创建的库 我一直致力于将一些代码移植到 F 但必须使用 C 库中的相当多的基础类型 一段代码需要计算一个值列表并将其分配给类中的公共字段 属性 该字段是一个包含两个 ICollection 的 C 类 我的 F 代码工作正
  • 如何从 com.google.api.client.googleapis.json.GoogleJsonResponseException 上失败的 Cloud Dataflow 作业恢复: 410 Gone

    我的 Cloud Dataflow 作业在运行 4 小时后神秘地失败 因为工作人员抛出此异常四次 在一小时内 异常堆栈看起来像这样 java io IOException com google api client googleapis j
  • 当代码发生更改时,Visual Studio 2010 在运行前不会生成

    多年来我一直使用 F5 开始调试 来构建代码 如果它已经过时 然后进行调试 这也适用于 VS 2010 但是今天它只是在没有构建的情况下开始调试 假设我对项目进行了清理 然后按 F5 而不是构建它 以便它可以运行 它会抛出一条错误消息 指出
  • Angular 4 Form FormArray 添加按钮以添加或删除表单输入行

    我正在使用 Angular 4 0 2 构建一个应用程序 如何向表单添加按钮以添加新的输入行和删除按钮以删除特定行 我的意思是我想要一个像这样的表格 我希望我的表格看起来像这样 这是我的代码 添加发票 component html h3 c
  • 无法修改iframe的内容,什么问题?

    我正在尝试修改 iframe 的内容 但它不起作用 这是我的 main html h3 Main page h3
  • 为什么枚举与 Windows 中的位字段不兼容?

    我正在研究 Windows 和 Linux 的 EBDS 协议接口 我试图将协议所需的所有数据打包到结构中 然后将结构本身和所有其他内容写入串行端口 将其发送到设备 协议的第一部分是数据打包 其中一个包的部分是与以下描述相匹配的控制字节 B
  • 在 C++ 中扩展数组时出现问题

    我正在为课堂编写一个模拟 其中一部分涉及生物体的繁殖 我的生物体被保存在一个阵列中 当它们繁殖时我需要增加阵列的大小 因为我有多个生物体的多个类 所以我使用了一个模板 template
  • constexpr 用于派生类中空初始化的构造函数

    我有类似以下内容 class Base public explicit Base int i noexcept type new int type i constexpr Base std nullptr t type nullptr Ba
  • perf-report显示CPU寄存器的值

    我跟随这个文件并使用perf record with intr regs ax bx r15 尝试使用 PEBS 记录记录其他 CPU 寄存器信息 但是我如何从 perf data 查看这些信息 原来的命令是perf report 并且只显
  • 如何使用 XPath 选择器排除子节点?

    我有以下 HTML 片段 div class d1 p text br p div class d2 text div a class a1 a1 a a class a2 a2 a div 我想获取的内容d1类并排除a1 and a2使用
  • Ruby TCPServer 获取客户端IP地址

    这是我不起作用的脚本 只是挂起 require socket server TCPServer new 2000 loop do Thread start server accept do client sock domain remote
  • 如何使用 ng 风格的进度条

    我正在尝试用 ng 风格制作一个进度条 问题是 当我做到这一点时 进度滑块仅在中间移动 并且没有覆盖整个栏 进度条应该以小时为单位 例如 4h 5h 等 当我用 制作它时 它就可以工作 有人可以帮忙吗 这是我的代码 div class pr
  • R JSON UTF-8解析

    我在尝试用 R 解析俄语字母表的 JSON 文件时遇到问题 该文件如下所示 text type status text type status text type status 并且以UTF 8编码保存 我尝试了 rjson RJSONIO
  • 是什么阻止您编写特定于 ruby​​ 1.9 的代码? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 到目前为止 我只是使用 YARV ruby 1 9 作为比 ruby 1 8 更快的 ruby 实现 并确保我的所有代码都向后兼容 ruby 1 8 6 什么情况 如果有 阻止您
  • 是否可以使用 jax-ws 生成 xml,但不将其发送出去

    所以这是场景 我们有 PeopleSoft 希望从销售人员来回发送消息 不幸的是 PeopleSoft 没有像 wsimport 这样的工具 它可以使用 wsdl 并为您生成类 有一些东西会消耗 wsdl 但它所做的只是生成存根消息对象 开
  • 无法触发 git 子模块上的提交后 git hook

    我们使用带有多个子模块的 git 模块 为了让日常使用更方便 我想要一个 post commit 钩子 它会自动将子模块添加到 main super root git repo clone module 中的 git 索引中 例如git a
  • 空基类是否应该影响派生类的布局?

    C 标准 引用草案 n3242 对子对象 intro object 有如下规定 除非对象是位域或零的基类子对象 size 该对象的地址是它的第一个字节的地址 占据 两个不同的对象 既不是位域也不是基数 零大小的类子对象应具有不同的地址 现在