0

在 C++ 中,类构造函数可以使用初始化列表,有人告诉我这是一个通过避免额外分配来提高性能的特性。所以我想知道是否有一种类似的方法可以在 C 中实现与 C++ 类构造函数基本相同目的的函数相同的好处?

我有点不清楚该功能在 C++ 编译器中究竟是如何工作的,因此也将不胜感激有关该主题的任何其他信息。

4

4 回答 4

4

C 没有任何类似的功能,但是由于 C 也没有构造函数,因此不存在不必要的赋值的危险。

更大的原则是,将一个特性引入一门语言通常会产生对附加特性的需求,以加强原始语言。一个简单的例子是线程。如果线程作为一种特性内置于语言中,那么直接的问题就是如何同步它们。因此也需要同步。因此,您会看到没有内置线程或同步的语言(如 C)和两者兼有的语言,但没有一种没有另一种。在这里,构造函数是线程,同步是列出初始值设定项。

于 2013-03-09T17:08:19.763 回答
2

在 C++ 构造函数中,初始化列表允许 C++ 编译器在成员变量的位置就地构造成员,而不是使用赋值运算符、复制构造函数或移动构造函数来初始化成员变量。有关更多详细信息,请参阅C++ FAQ 的第 10.6 节

在 C 中,C 编译器没有提供这样的自动操作。这意味着程序员直接控制所有的初始化,不需要特殊的语言特性来避免这些额外的操作。

为了更清楚一点,请考虑在 C++ 构造函数中使用赋值初始化时会发生什么:

  1. 成员变量首先使用默认构造函数构造
  2. 构造了一个临时对象
  3. 调用赋值或移动赋值运算符以使用临时变量重新初始化成员变量。
  4. 临时调用析构函数。

虽然某些编译器可以在某些情况下优化这些步骤,但您的情况可能会有所不同,并且没有 C++ 编译器可以在所有情况下优化这些步骤。现在,考虑一下程序员如何在 C 中完全复制这些步骤:

void my_struct_init(struct my_struct* sp)
{
  member_init_default(&sp->the_member);  /* default constructor for member */

  struct member memb; /* temporary on stack */
  member_init_other(&memb, ...params...);  /* initialize memb */
  member_assign(&sp->the_member,&memb);    /* assign member */
  member_finalize(&memb);                  /* finalize the temporary */
}

很少有 C 程序员会这样做(没有充分的理由)。相反,他们会自动编码优化:

  member_init_other(&sp->the_member, ...params...);

该功能存在于 C++ 中,因为编译器为程序员做了很多自动化的事情。这通常使程序员的工作更轻松,但需要诸如初始化列表之类的功能来帮助编译器生成最佳代码。C 编译器提供了一个更简单的底层机器模型,自动执行的操作更少,因此需要更少的功能(尽管不一定需要更少的工作)来生成类似的最佳代码。

于 2013-03-09T18:32:51.083 回答
1

C 中没有这样的特性。最接近的是指定的初始化程序

于 2013-03-09T17:09:31.593 回答
-1

您可以编写一个单独的函数并在从类创建对象时调用它,然后将其传递给它:

C:

typedef struct {
        int x;
}mine;

void mine_initializer(mine* me)
{
        me->x = 4; //initialization
}

int main(void)
{
        mine me;
        mine_initializer(&me);
        return 0;
}

你也可以在 C++ 中做到这一点:

struct mine{
        int x;
        void initialize()
        {
                x = 4; //initialization
        }
};



void main(void)
{
        mine me;
        me.initialize();
        printf("%d",me.x);
}

这将4作为结果输出。

于 2013-03-09T17:20:22.387 回答