Performance C struct vs C ++ struct / class

时间:2014-02-12 16:28:57

标签: c++ c class struct

我有一个带有相关功能的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 ++的混合物)

3 个答案:

答案 0 :(得分:3)

  

将这些结构传递给函数/方法时哪个更快?

成员函数应该像非成员一样以指针作为参数调用;因为这正是一个(非虚拟的,非静态的)成员函数。

第一个非成员函数的调用速度可能比第一个成员快一些,因为它不需要隐藏的this参数。但是,它不访问它所调用的对象,因此它可以是静态的或非成员的;在这种情况下,它将与非成员一样快。

第二个将其隐藏参数作为指针,因此它可能比取得一个值的非成员函数更慢或更快,具体取决于它正在使用它做什么。

  

由于C结构是静态的,只有一个实例驻留在内存中,但是C ++结构会发生什么?

C结构不是静态的。您可以像创建局部变量一样创建和销毁它们 - 就像您在创建局部变量时所做的那样,然后返回它的副本。在这方面,C ++类是一样的。

  

它的方法(func3()和func4())是否占用每个实例的冗余内存

不,成员函数不占用类实例中的任何内存。与非成员函数一样,代码只存在于一个地方;唯一真正的区别是成员函数传递了额外的参数。

如果类具有虚函数,那么(通常)会向每个对象添加一个指针 vptr ,以及一个函数指针的静态表和其他运行时类型信息( vtable )为班级。

  

在传递C ++结构时,只传递实例变量a和b?

事实上。这是一个标准布局类,这意味着它包含的唯一内容就是它的数据成员,就像C结构一样。

  

对这些函数的函数调用更快(如果有任何区别)?

他们应该是一样的;两者都按值传递一个包含相同数据成员的普通可复制对象。

答案 1 :(得分:2)

C ++ classstruct的方法代码(它完全相同)只包含在您的可执行文件中一次,并且只在内存中出现一次。无论你创建了多少个对象或者你称它们多少次¹。

方法和自由函数之间的唯一区别是该方法以this的形式获得额外的“隐藏”参数。所以即使实例变量也不是单独传递的。


¹声明方法inline(或者等效地,在类定义中定义它们)可能会导致最终可执行文件中包含相同代码的多个副本。这种行为通常非常特定于编译器,并且在任何情况下也适用于inline自由函数。

答案 2 :(得分:0)

考虑到语言规范,您唯一可以肯定的是:structclassunion是C ++中唯一的3类类型,这就是structclass之间的相似度来自。

对于其他所有你应该分析,调试和比较不同的实现和编译器,毕竟C++仍然是一种编译语言,如果你不编译它,并不是关于给定程序的所有内容。< / p>