我有一个带有相关功能的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
...
}
};
我的问题:将这些结构传递给函数/方法时哪个更快?
由于在StructC上运行的C函数是静态的,因此只有一个实例驻留在内存中,但结构中的C ++方法会发生什么?
它的方法(func3()和func4())是否占用每个实例的冗余内存,或者C ++编译器是否优化它以仅保存一个实例,因此在传递C ++结构时,只有实例变量a和b ,被传递?
对这些函数的函数调用更快(如果有任何区别)?:
void functionA(StructC var); //StructC as argument
void functionB(StructCPP var); //StructCPP as argument
(该程序是C和C ++的混合物)
答案 0 :(得分:3)
将这些结构传递给函数/方法时哪个更快?
成员函数应该像非成员一样以指针作为参数调用;因为这正是一个(非虚拟的,非静态的)成员函数。
第一个非成员函数的调用速度可能比第一个成员快一些,因为它不需要隐藏的this
参数。但是,它不访问它所调用的对象,因此它可以是静态的或非成员的;在这种情况下,它将与非成员一样快。
第二个将其隐藏参数作为指针,因此它可能比取得一个值的非成员函数更慢或更快,具体取决于它正在使用它做什么。
由于C结构是静态的,只有一个实例驻留在内存中,但是C ++结构会发生什么?
C结构不是静态的。您可以像创建局部变量一样创建和销毁它们 - 就像您在创建局部变量时所做的那样,然后返回它的副本。在这方面,C ++类是一样的。
它的方法(func3()和func4())是否占用每个实例的冗余内存
不,成员函数不占用类实例中的任何内存。与非成员函数一样,代码只存在于一个地方;唯一真正的区别是成员函数传递了额外的参数。
如果类具有虚函数,那么(通常)会向每个对象添加一个指针 vptr ,以及一个函数指针的静态表和其他运行时类型信息( vtable )为班级。
在传递C ++结构时,只传递实例变量a和b?
事实上。这是一个标准布局类,这意味着它包含的唯一内容就是它的数据成员,就像C结构一样。
对这些函数的函数调用更快(如果有任何区别)?
他们应该是一样的;两者都按值传递一个包含相同数据成员的普通可复制对象。
答案 1 :(得分:2)
C ++ class
或struct
的方法代码(它完全相同)只包含在您的可执行文件中一次,并且只在内存中出现一次。无论你创建了多少个对象或者你称它们多少次¹。
方法和自由函数之间的唯一区别是该方法以this
的形式获得额外的“隐藏”参数。所以即使实例变量也不是单独传递的。
¹声明方法inline
(或者等效地,在类定义中定义它们)可能会导致最终可执行文件中包含相同代码的多个副本。这种行为通常非常特定于编译器,并且在任何情况下也适用于inline
自由函数。
答案 2 :(得分:0)
考虑到语言规范,您唯一可以肯定的是:struct
,class
和union
是C ++中唯一的3类类型,这就是struct
和class
之间的相似度来自。
对于其他所有你应该分析,调试和比较不同的实现和编译器,毕竟C++
仍然是一种编译语言,如果你不编译它,并不是关于给定程序的所有内容。< / p>