在 C++ 中,类构造函数可以使用初始化列表,有人告诉我这是一个通过避免额外分配来提高性能的特性。所以我想知道是否有一种类似的方法可以在 C 中实现与 C++ 类构造函数基本相同目的的函数相同的好处?
我有点不清楚该功能在 C++ 编译器中究竟是如何工作的,因此也将不胜感激有关该主题的任何其他信息。
在 C++ 中,类构造函数可以使用初始化列表,有人告诉我这是一个通过避免额外分配来提高性能的特性。所以我想知道是否有一种类似的方法可以在 C 中实现与 C++ 类构造函数基本相同目的的函数相同的好处?
我有点不清楚该功能在 C++ 编译器中究竟是如何工作的,因此也将不胜感激有关该主题的任何其他信息。
C 没有任何类似的功能,但是由于 C 也没有构造函数,因此不存在不必要的赋值的危险。
更大的原则是,将一个特性引入一门语言通常会产生对附加特性的需求,以加强原始语言。一个简单的例子是线程。如果线程作为一种特性内置于语言中,那么直接的问题就是如何同步它们。因此也需要同步。因此,您会看到没有内置线程或同步的语言(如 C)和两者兼有的语言,但没有一种没有另一种。在这里,构造函数是线程,同步是列出初始值设定项。
在 C++ 构造函数中,初始化列表允许 C++ 编译器在成员变量的位置就地构造成员,而不是使用赋值运算符、复制构造函数或移动构造函数来初始化成员变量。有关更多详细信息,请参阅C++ FAQ 的第 10.6 节。
在 C 中,C 编译器没有提供这样的自动操作。这意味着程序员直接控制所有的初始化,不需要特殊的语言特性来避免这些额外的操作。
为了更清楚一点,请考虑在 C++ 构造函数中使用赋值初始化时会发生什么:
虽然某些编译器可以在某些情况下优化这些步骤,但您的情况可能会有所不同,并且没有 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 编译器提供了一个更简单的底层机器模型,自动执行的操作更少,因此需要更少的功能(尽管不一定需要更少的工作)来生成类似的最佳代码。
C 中没有这样的特性。最接近的是指定的初始化程序。
您可以编写一个单独的函数并在从类创建对象时调用它,然后将其传递给它:
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
作为结果输出。