我有一个带有相关函数的C结构:
struct StructC {
int a;
int b;
};
static inline StructC func1()
{
StructC ret;
//do something with variables ret.a and ret.b
return ret;
}
static inline void func2(StructC var)
{
//do something with variables var.a and var.b
...
}
和C++结构:
struct StructCPP {
int a;
int b;
StructCPP func3() //can also be static
{
StructCPP ret;
//do something with instance variables ret.a and ret.b
return ret;
}
void func4() //can't use static here since it operates on the instance variables
{
//do something with instance variables a and b
...
}
};
我的问题是:将这些结构传递给函数/方法时,哪个更快?
因为在结构上运行的C函数是静态的,所以只有一个实例驻留在内存中,但是C++结构中的结构会发生什么呢?
它的方法(函数3)和函数4()是否占用每个实例的冗余内存,或者C++编译器优化它只保存一个实例,因此在传递C++结构时,只传递实例变量A和B?
对这些函数的哪个函数调用更快(如果有区别的话)?:
void functionA(StructC var); //StructC as argument
void functionB(StructCPP var); //StructCPP as argument
(程序是C和C++的混合)
最佳答案
将这些结构传递给函数/方法时哪个更快?
成员函数的调用速度应该和非成员以指针为参数的调用速度一样快;因为这正是(非虚拟、非静态)成员函数的含义。
第一个非成员函数的调用速度可能比第一个成员稍快,因为它不接受隐藏的this
参数。但是,它无法访问调用它的对象,因此它可能是静态的或非成员的;在这种情况下,它将与非成员的速度完全相同。
第二个函数将其隐藏的参数作为指针,因此它可能比非成员函数获取值慢或快,具体取决于它对该值所做的操作。
由于C语言是静态的,所以只有一个实例驻留在内存中,但是C++会发生什么呢?
C结构不是静态的。您可以像创建和销毁任何其他对象一样创建和销毁它们,就像您的示例在创建局部变量时所做的那样,然后返回它的副本。C++类在这方面是一样的。
它的方法(func3()和func4())是否为每个实例占用冗余内存
不,成员函数不占用类实例中的任何内存。与非成员函数一样,代码只存在于一个地方;唯一的真正区别是成员函数传递一个额外的参数。
如果类具有虚拟函数,则(通常)会向每个对象添加一个指针vptr,以及一个包含函数指针和类的其他运行时类型信息(vtable)的静态表。
在传递C++结构时,只传递实例变量A和B?
的确。这是一个标准的布局类,这意味着它只包含数据成员,就像C结构一样。
对这些函数的哪个函数调用更快(如果有区别的话)?
它们应该是相同的;两者都按值传递包含相同数据成员的可复制对象。