【问题标题】:Status of procedures(methods and operations) in objects in Design Patterns设计模式中对象的过程(方法和操作)状态
【发布时间】:2019-08-12 09:37:25
【问题描述】:

我正在阅读Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides 所著的Design Patterns一书

第 11 页,上面写着: "一个对象将数据和对数据进行操作的procedures 打包在一起"。

但我还有一个问题:

当您使用 C++ 编码时: 当一个对象被实例化时,它自己的汇编代码中真的有编译器生成的方法吗? 还是所有objects的方法都是同一个类生成的?

这是我很久以来的一个问题。

提前谢谢你。

【问题讨论】:

  • 你为什么在乎?这两种情况有什么明显的区别吗?
  • 您引用的部分是关于概念的(在许多语言中都适用),而您的问题是关于实现细节的,那是完全不同的故事,不清楚您的问题到底是什么。
  • 该方法对所有对象都是通用的,它有一个隐式参数 (this) 允许它对任何特定对象进行操作。这就是所有 C++ 实现的操作方式,但该语言实际上并不需要这个 (AFAIK)。
  • 添加。致@john:如果您想知道this 是如何为每个成员函数调用初始化的......调用成员函数的对象(地址)通常像内部的其他参数一样传递。 (当我偶然发现和你一样的问题时,我曾经在查看 ASM 代码时发现了这一点。);-)
  • 为了更好地解释我的问题:假设您在 C++ 中有 2 个 C 类的对象 a 和 b。假设 C 有一个方法 f。 a 和 b 在编写时封装变量和方法。但是 Do a 和 b 对于同一个函数 f 有自己的代码。还是f在Assembly中只定义了一次,而a和b在调用f时调用的是同一个位置?

标签: c++ oop object design-patterns


【解决方案1】:

与类关联的代码是不变的——语言中无法更改它,并且对于类的所有实例都是相同的,因此不会为每个实例重新复制它。

通常,同一类的所有实例共享相同的代码,但这并不意味着方法执行总是在内存中执行完全相同的指令:

  • 可以内联方法,在这种情况下,方法实现被复制到调用函数中,并在该上下文中单独优化;

  • 模板类为每组独特的模板参数生成不同的机器代码实现方法;

  • 头文件中定义的方法可以在许多对象模块中变成机器代码。链接器会尝试合并所有副本,但这并不是真正需要的,而且并不总是普遍发生。

现在这些对你来说可能都不重要。重要的区别是所有机器代码方法实现都是在编译时生成的,它们不会被正在运行的程序复制或以其他方式操作。

【讨论】:

  • 您的解释对我澄清编译时运行时发生的事情有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2013-08-27
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多