C++ 性能C结构与C++;结构/类

C++ 性能C结构与C++;结构/类,c++,c,class,struct,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 variable

我有一个带有相关函数的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++结构:< /P>

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++结构中的C++方法会发生什么?p>

方法是否(FRON3-)和函数4()在每个实例中占用冗余内存,或者C++编译器优化它只保存一个实例,因此在传递C++结构时,只有实例变量A和B通过?< /P> 对这些函数的哪个函数调用更快(如果有任何差异):


(程序是C和C++的混合)

代码的方法> C++ >代码>类< /COD>或Stult(完全相同)只包含在你的可执行文件中,只在内存中一次。不管你创建了多少个对象,也不管你调用它们多少次

方法和自由函数之间的唯一区别在于,该方法以
this
的形式获得一个额外的“隐藏”参数。因此,甚至实例变量也不是单独传递的



宣布方法
inline
(或等效地在类定义中定义它们)可能会导致同一代码的多个副本包含在最终可执行文件中。这种行为一般是非常编译器特定的,并且在任何情况下也适用于<代码>内联< /COD>自由函数。 >代码> C++ >代码>类< <代码>或<代码>结构> <代码>(完全相同)只包含在您的可执行文件中,并且只在内存中一次。不管你创建了多少个对象,也不管你调用它们多少次

方法和自由函数之间的唯一区别在于,该方法以
this
的形式获得一个额外的“隐藏”参数。因此,甚至实例变量也不是单独传递的


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

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

成员函数的调用速度应该与以指针作为参数的非成员函数的调用速度一样快;因为这正是(非虚拟、非静态)成员函数的含义

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

第二个函数将其隐藏参数作为指针,因此它可能比非成员函数获取值的速度慢或快,具体取决于它使用它的方式

<>因为C结构是静态的,只有一个实例驻留在内存中,但是C++结构的运行情况如何?

C结构不是静态的。您可以像创建和销毁任何其他对象一样创建和销毁它们—就像您的示例创建局部变量然后返回其副本时所做的那样。C++类在这方面是一样的。 它的方法(func3()和func4())是否会为每个实例占用冗余内存

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

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

在传递C++结构时,只有实例变量A和B通过?< /P> 的确如此。这是一个标准布局类,这意味着它只包含数据成员,就像C结构一样

哪个函数调用这些函数更快(如果有任何差异)

它们应该是相同的;两者都通过值传递包含相同数据成员的普通可复制对象

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

成员函数的调用速度应该与以指针作为参数的非成员函数的调用速度一样快;因为这正是(非虚拟、非静态)成员函数的含义

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

第二个函数将其隐藏参数作为指针,因此它可能比非成员函数获取值的速度慢或快,具体取决于它使用它的方式

<>因为C结构是静态的,只有一个实例驻留在内存中,但是C++结构的运行情况如何?

C结构不是静态的。您可以像创建和销毁任何其他对象一样创建和销毁它们—就像您的示例创建局部变量然后返回其副本时所做的那样。C++类在这方面是一样的。 它的方法(func3()和func4())是否会为每个实例占用冗余内存

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

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

wh
void functionA(StructC var);      //StructC as argument
void functionB(StructCPP var);    //StructCPP as argument