向基类添加默认构造函数会更改派生类型的 sizeof() [重复]

2023-11-21

我倾向于认为我对 C++ 内部结构和内存布局有很好的掌握,但这让我感到困惑。我有以下测试代码:

#include <stdio.h>

struct Foo
{
    //Foo() {}
    int x;
    char y;
};

struct Bar : public Foo
{
    char z[3];
};

int main()
{
    printf( "Foo: %u Bar: %u\n", (unsigned)sizeof( Foo ), (unsigned)sizeof( Bar ) );
}

输出是合理的:

食物:8 酒吧:12

然而,这是非常奇怪的部分,如果我取消注释 Foo() 上的简单默认构造函数,则 sizeof( Bar ) 会发生变化!添加一个ctor怎么可能改变这些类的内存布局呢?

食物:8 酒吧:8

使用gcc-7.2编译


GCC 遵循用于 C++ 的 Itanium ABI,它防止使用 POD 的尾部填充来存储派生类数据成员。

添加用户提供的构造函数意味着Foo不再是 POD,因此该限制不适用于Bar.

看到这个问题有关 ABI 的更多详细信息。

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

向基类添加默认构造函数会更改派生类型的 sizeof() [重复] 的相关文章

随机推荐

  • TF10175:团队项目不存在

    我使用 Visualstudio Online 作为存储库 我从项目集合中删除了 ProjectName 项目 之后我只在一台计算机上出现错误 TF10175 ProjectName 团队项目不存在 有解决这个问题的想法吗 我通过删除我的工
  • Unity应用程序块,如何将参数传递给注入工厂?

    这是我现在拥有的 Container RegisterType
  • 何时在 C++ 中使用 void*

    我正在努力思考一个问题void 我应该了解什么是正确的使用方式以及是否存在任何潜在的滥用行为 意思是很酷的东西 没有错 我不明白如何以及为什么使用void 如果我理解的话 我需要将当前指针转换为void 然后当我想使用它时又投射回原来的 为
  • 在大文件中查找和替换

    我想在一个大的 xml 文件中找到一段文本 并想用其他文本替换 文件大小约为 50GB 我想在命令行中执行此操作 我正在查看 PowerShell 想知道它是否可以处理大尺寸 目前我正在尝试这样的事情 但它不喜欢它 Get Content
  • Libgdx |场景2d |设置表格的背景颜色?

    我正在创建一个菜单 就像 flappybird 中的菜单一样 当你死时它会在播放屏幕上弹出 我创建了一个扩展表格的类 我想将表格的背景设置为白色 有没有办法做到这一点 你可以这样做 Pixmap bgPixmap new Pixmap 1
  • 如何使用javascript删除CSS属性?

    是否可以使用 JavaScript 删除元素的 CSS 属性 例如我有div style zoom 1 2 现在我想通过 JavaScript 删除缩放属性 您有两个选择 选项1 您可以使用移除属性方法 它将从元素中删除样式 el styl
  • Haskell:获取表达式的静态类型

    我正在寻找一个可以完成 GHCi type 命令的功能的函数 理想情况下 它会有一个类似的签名 getStaticType a gt String a getStaticType 1 2 a Num t gt t b getStaticTy
  • 子句之间的多个 MySql WHERE

    MySql 新手程序员感谢您的耐心等待 我试图跟踪满足 3 个不同条件的表中的 ID 号 这就是我所得到的 但是查询不会返回表中明确匹配的任何结果 想法 SELECT FROM table WHERE x BETWEEN 80 AND 20
  • 仅底角或顶角为圆角的 ImageView

    我对这个问题有答案 但我花了太多时间寻找它 这就是我创建这个问题的原因 这样对其他人来说会更容易 您不能像通常的视图一样使用形状 drawable 来圆化图像角 这就是为什么您需要对代码内的图像进行一些更改 这是使用材料设计来做到这一点的另
  • 使用 nbconvert 从 Jupyter Notebook 中删除单元格

    中提到的建议如何在 IPython Notebook 中隐藏一个特定单元格 输入或输出 不工作 在 Windows 上我执行以下操作 jupyter nbconvert a ipynb TagRemovePreprocessor remov
  • Android VideoView - 如何按顺序播放视频

    我正在尝试开发一款 Android 应用程序 可以在一个视频视图中播放多个视频 当一个完成后 第二个必须开始 依此类推 我的视频存储在项目的 raw 文件夹中 为了获取他们的文件名 我这样做 Field fields R raw class
  • 当 VS 解决方案中的目标失败时,如何使 msbuild 失败?

    我在命令行上使用 msbuild 来构建包含 C 项目的 VS2012 解决方案 该项目有一个在构建后运行的目标
  • 如何使用终端调用jar文件中的方法?

    我在 jar 文件中有一个已编译的项目 我需要从中调用一个方法 如何在 ubuntu 终端中执行此操作 您不能从任何类的终端或 cmd 调用任何方法 您可以通过终端执行课程 If your jar是可执行的尝试 java jar Name
  • Android ContentProvider读写权限

    权限似乎没有任何区别 在清单中 我只有一个
  • Field...Room 持久性库的 getter 不明确

    我有以下实体 public class User PrimaryKey private final long id private String id private String userName private String email
  • Symfony2 - 在实体构造函数中设置默认值

    我可以设置一个简单的默认值 例如字符串或布尔值 但我找不到如何设置实体的默认值 在我的 User php 实体中 ORM ManyToOne targetEntity Acme DemoBundle Entity Foo protected
  • C# 为什么 sizeof 不安全以及如何以安全的方式获取结构体的大小?

    我定义了一个通过套接字发送的结构 我想知道它的大小 但是sizeof是不安全的 对于 System Runtime InteropServices MarshalSizeOf 有没有办法以安全的方式获取它的大小 对于托管结构没有办法做到这一
  • Selenium 和 SSL 证书中的 Chromedriver

    我正在使用 Selenium 来测试一个具有 HTTP Auth 甚至 SSL 证书的网站 作为 HTTP 基本身份验证的解决方法 我正在使用 ChromeDriver http code google com p selenium wik
  • 在 Mongodb 中使用 .aggregate 的 findOne 相当于什么?

    基本上 我设法从集合中返回所有对象 例如 如何返回单个元素 风格findOne id 5e82d378527bb420a4001aaf 我知道如何使用 match 但这会返回各种结果 let id 5e82d378527bb420a4001
  • 向基类添加默认构造函数会更改派生类型的 sizeof() [重复]

    这个问题在这里已经有答案了 我倾向于认为我对 C 内部结构和内存布局有很好的掌握 但这让我感到困惑 我有以下测试代码 include