C++ 无递归初始化

C++ 无递归初始化,c++,c,inheritance,recursion,struct,C++,C,Inheritance,Recursion,Struct,我正在尝试进行一些重构,我很好奇您将如何处理这个问题 基本上,我试图为每个类创建一个初始化函数。有些类继承自其他类,如果可能的话,我想使用父初始化函数。你将如何解决这个问题 我想将这些结构与memcpy一起使用,也可以将它们与关键字align和\uuuuuu属性((打包))一起使用;而且它们必须与extern“C”一起使用。我将排除构造函数和析构函数 举例说明: struct A { int a; }; void initialize(A& a) { a = 0

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

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

我想将这些结构与
memcpy
一起使用,也可以将它们与关键字
align
\uuuuuu属性((打包))
一起使用;而且它们必须与
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;
  };

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

使用
静态\u cast

在您的代码中,
initialize(b)
调用将无限递归,因为
b
A&
更适合作为
b&
(您要调用的函数的参数),因此重载解析选择相同的函数并递归

您指定要初始化
b
对象的
A
部分。为什么不告诉编译器呢?告诉它您想在其中调用
初始化
,就像它是一个
A
,如下所示:

initialize(static_cast<A&>(b));
初始化(静态_cast(b));

至于你在评论中提到的问题,这里没有复印件。但是,如果我使用了
static\u cast
,则会创建一个临时对象,但事实并非如此。我不是将
b
强制转换为
a
类型的对象。我将其转换为
a
类型的引用,这将导致创建临时引用。由于<>代码> A/<代码>与 A<和> > > > <>代码> b和<代码>,所以第一个函数将被选中,从而避免递归。

在仔细阅读您的问题后,您希望使用C.C++不是对你来说是什么意思。我不认为它有任何继承。我使用C++,但将来我可以用它们来做C API。<代码>初始化(b)<代码> >代码>初始化(StistaCype(b))< /C>。但由于没有进一步的编辑和澄清,我决定根据我的评论提供一个答案。我同意答案属于答案部分,而不是评论部分。谢谢你的回答,非常清楚。但是,将创建引用的副本。如果您手动执行此操作,速度会更快assignments@Saturnu你测量的速度快了多少?@Saturnu如果你的生命依赖于一个指针大小的副本,那么你需要编写汇编;不是C,也不是非常C++。@ Saturnu,对于你编写的任何代码,我可以编写一个编译器,只使代码比正常时间长1000000倍。事实上,这是非常容易做到的(例如,包装clang,但在传递之前检查源[或AST]是否完全匹配,如果匹配,则添加一堆垃圾以浪费时间)。这与性能问题毫不相干。“它优化掉临时引用了吗?”深入到过早优化中,我不知道你认为“过早优化”是什么意思。@Saturnu该模式是“为目标平台编写优化的汇编代码”。希望现代编译器不会打败你,因为他们仍然比你更了解这个平台。一劳永逸:不要仅仅因为某个模式在你的心智模型中包含了一个额外的步骤就认为它是缓慢的。如果你想要最快的代码,你必须测量。从外面讲道理对你毫无帮助。