问题标签 [object-layout]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
318 浏览

c++ - 指向对象的指针 == 指向第一个成员的指针?

为什么以下代码中的 if 条件为真?

在阅读Stroustrup关于空类的常见问题解答时,我有点困惑,特别是下面的声明:

0 投票
4 回答
1071 浏览

c++ - C ++中嵌套类和多重继承之间的内存布局差异?

我试图了解 COM 如何指定其对象的布局,以便想要使用 COM 对象的客户端知道如何去做。

我读过一个实现多个接口的 COM 对象可以通过不同的方式来实现它,包括使用嵌套类或多重继承。

我的理解是,这两种技术都必须产生相同的内存布局(符合 COM 规范),以便想要使用 COM 对象(例如在 C 中)的客户端知道如何去做。

所以我的具体问题是:使用多重继承与嵌套类实现的 c++ 对象的内存布局是否存在差异。

有人可以指出指定 COM 对象布局的位置吗?

0 投票
4 回答
3365 浏览

c++ - C++中的虚拟继承

我在阅读 C++ 中的虚拟继承时在一个网站上找到了这个

使用多重继承时,有时需要使用虚拟继承。一个很好的例子是标准 iostream 类层次结构:

C++ 如何确保只存在一个虚拟成员的单个实例,而不考虑从它派生的类的数量?C++ 使用额外的间接级别来访问虚拟类,通常是通过指针。换句话说,iostream 层次结构中的每个对象都有一个指向 ios 对象共享实例的指针。额外的间接级别有轻微的性能开销,但这是一个很小的代价。

我对以下声明感到困惑:

C++ 使用额外的间接级别来访问虚拟类,通常通过指针

有人可以解释一下吗?

0 投票
1 回答
188 浏览

garbage-collection - 面向对象语言的堆对象表示

作为我硕士论文的一部分,我正在为我家乡大学开发的面向对象语言编写一个编译器。当前编译器输出在虚拟机上运行的汇编程序。虚拟机处理所有事情,如堆栈操作、对象生成、堆管理和垃圾收集。

我的编译器的目标架构是类似 MIPS 的 CPU。

我正在寻找开发对象布局的策略以及在运行时实现和触发垃圾收集的想法。我当然可以分析 GCC 如何使用 C++ 实现这一点,但我更愿意指出一些好的出版物/资源。

0 投票
3 回答
145 浏览

c++ - 额外的继承对对象结构或实例化有什么影响吗?

在代码中有一些特殊的类,也有一些普通的类。我想将它们区分开来,因为特殊课程需要给予不同的待遇。所有这些特殊类都是基础类(不是任何其他类的子类)

为了实现这一点,我class在源代码中标记了特殊的 es,方法是向它们插入一个空的继承struct

每当需要时,我都可以使用is_base_of<Base,Derived>. 另一种方法是typedef在特殊类中使用:

问题是,如果A's 的孩子是从多个类继承的,那么就会有模棱两可typedef的 s。

问题:添加像空继承这样的接口class _special,是否会以任何方式损害当前代码(例如对象结构、编译错误等)?

0 投票
1 回答
77 浏览

c++ - 对象的布局

我想了解一个对象的布局。所以我用不同顺序的成员变量执行。一切都如预期的那样,期待接下来的序列。

输出:

正如我预期的16。

但是如果我从 Test1 中删除 m_a,它会给出预期的输入(12)。

输出:

如果我删除与 4 位边界完全对齐的整数,为什么会有 8 个字节的差异?

PS:我知道这是特定于实现的。我想知道该实现是如何完成的:)。这是因为我想访问私人成员,所以想了解对象布局!

0 投票
2 回答
58 浏览

c++ - 铸造和对象布局

我试图通过转换以下两个不相关的类来理解对象的布局:

要测试类,主要有以下代码:

据我了解,

  • 调用会成功
  • B::_x 的值为 A::_a
  • 在运行时,尝试访问 B::Show() 中的 B::_y 和 B::_z 应该会崩溃,因为该对象最初是 A 类型且大小为 4 字节,而编译器期望 _y 和 _z与大小为 12 字节的 B 对象的起始地址相距 4 和 8 字节的偏移量。

实际上,尽管使用 VS2010,在调试模式下,B::Show() 中的语句被打印并且 _y 和 _z 指向垃圾值,在发布模式下,语句被打印,并且 _y 和 _z 指向垃圾值,然后发生崩溃(仅有时:-()。

我预计我们应该在尝试访问 _y 和 _z 时立即观察到崩溃,因为它们必须指向未分配的内存,但这并没有发生。我知道这种情况应该属于“未定义行为”的范畴,但这种行为的可能解释是什么?

0 投票
2 回答
119 浏览

c++ - C++中指向数据成员的指针的值

遇到一个很奇怪的问题,有人知道这是什么原因吗?代码在 Visual Studio 2012 下测试。

0 投票
5 回答
485 浏览

c++ - 数据成员是否形成范围?

我可以将相同类型的连续数据成员视为一个范围吗?例如:

0 投票
6 回答
1682 浏览

c++ - C++ 对象内存布局

我试图了解 C++ 在多重继承中的对象布局。为此,我有两个超类 A、B 和一个子类 C。我在尝试转储它时期望看到的是:vfptr | A 领域 | vfptr | B 领域 | C的领域。

我得到了这个模型,但有一些我不明白的零。这是我正在尝试的代码

这是我得到的输出:

中间的零是什么意思?提前致谢!