【问题标题】:Initialization without recursion [closed]没有递归的初始化[关闭]
【发布时间】:2019-08-06 18:08:15
【问题描述】:

我正在尝试进行一些重构,我很好奇您将如何解决这个问题。

基本上我正在尝试为每个类创建一个初始化函数。有些类继承自其他类,如果可能,我想使用父初始化函数。你会如何解决这个问题?

我想将这些结构与memcpy 一起使用,也可能将它们与关键字align__attribute__((packed)) 一起使用;并且它们必须可以与extern "C" 一起使用。我会排除构造函数和析构函数。

举例说明:

struct A
  {
  int a;
  };

void initialize(A& a)  
  {
  a = 0;
  }

struct B : A
  {
  int b;
 };

void initialize(B& b)
  {
  initialize(b); // here I want void initialize(A& a), not recursion
  b = 0;
  };

也许我必须做一些演员表?理想情况下,我正在寻找一种不会产生开销的解决方案。

【问题讨论】:

  • 仔细阅读您的问题后,您想使用 C。C++ 似乎不适合您。
  • C 中没有引用。而且我也不认为它有任何继承。
  • 我正在使用 C++,但将来我可以将它们用于 C API。
  • initialize(b) -> initialize(static_cast<A&>(b)).
  • @MaxLanghof 最初我认为这个问题有点太不清楚,无法给出答案,但由于没有进行进一步的编辑,也没有给出任何澄清,我决定根据我的评论提供答案.我同意答案属于答案部分,而不是评论部分。

标签: c++ c inheritance recursion struct


【解决方案1】:

使用static_cast

在您的代码中,initialize(b) 调用将无限递归,因为bB& 匹配比A&(您要调用的函数的参数)更好,因此重载决议选择相同的功能和重复。

您指定要初始化b 对象的A 部分。为什么不告诉编译器呢?告诉它你想在其中调用initialise,就好像它是A,像这样:

initialize(static_cast<A&>(b));

至于您在评论中提到的问题 - 这里没有复制。但是,如果我使用static_cast&lt;A&gt;,则会创建一个临时对象,但事实并非如此。我没有将b 转换为A 类型的对象。我将其转换为A 类型的reference,这将导致创建临时引用。由于A&amp; 匹配A&amp; 比匹配B&amp; 更好,所以会选择第一个函数,从而避免递归。

【讨论】:

  • 谢谢你的回答,很清楚。但是,将创建引用的副本。如果你手动做作业会更快
  • @Saturnu 你测得有多快?
  • @Saturnu 如果您的生活依赖于单个指针大小的副本,那么您需要编写程序集;不是 C,也不是 C++。
  • @Saturnu 对于您编写的任何一段代码,我都可以编写一个编译器,该编译器只需要精确的代码比正常时间长 1000000 倍。实际上,这非常容易做到(例如包装 clang,但在传递之前检查源 [或 AST] 是否完全匹配,如果匹配则添加一堆垃圾以浪费时间)。这与性能问题无关。并且“它是否优化了临时参考?”对过早优化如此深入,以至于我不知道您认为“过早优化”是什么意思。
  • @Saturnu 该模式是“编写针对您的目标平台优化的汇编代码”。并希望现代编译器不会击败您,因为他们仍然比您更了解该平台。一劳永逸:不要仅仅因为它涉及到你的思维模型中的额外步骤就认为某些模式很慢。如果你想要最快的代码,你必须测量。从外部推理它会让你无处
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多