2014-02-12 114 views
0

我有一个C结构具有相关功能:性能C结构对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++的混合物)

+5

如果我没有弄错,我相信结构被解释为C++中的类。 – turnt

+0

您传递_objects_,而不是_structs_。与结构关联的方法不会被复制。如果这就是你要求的。 – stefan

+1

关于表现,在你问之前总是测试。你有没有尝试看看这里有什么区别?另外,我认为你对结构的理解基本上是不正确的。 –

回答

3

将这些结构体传递给函数/方法时速度更快吗?

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

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

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

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

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

做它的方法(FUNC3()和FUNC4())占据冗余内存为每个实例

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

如果类有虚函数,则该(典型地)增加了一个单一指针,的vptr,每个对象,用函数指针和其它运行时类型信息的,单一的静态表的速度(在虚表)为班级。

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

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

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

它们应该是相同的;都通过值包含相同的数据成员的可微复制的对象。

+0

我已经将C结构声明为static.I已修改我的问题以反映我的初衷。 – Alterecho

+0

@Alterecho:不,你已经声明这些函数是静态的。你的例子有两个结构类型的非静态对象。 (我已经更新了第一段来解决您的更改)。 –

+0

因此,在传递StructC和StructCPP的对象时没有性能差异? – Alterecho

2

代码的方法C++ classstruct(完全一样)仅包含一次在您的可执行文件中,并且只在内存中出现一次。无论您创建了多少个对象或多少次您称之为¹,都无关紧要。

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


¹声明方法inline(或等价地,定义它们的类定义)可能会导致同一代码的多个拷贝被包括在最后的可执行文件。这种行为通常非常适合编译器特定的情况,并且在任何情况下也适用于免费函数inline

+0

另请注意,在上面的例子中:如果成员func3是静态的,它甚至不应该有那些额外的参数,因此绝对没有性能差异。 –

+0

@ComicSansMS:尽管'inline'不是保证,而只是编译器的提示。坦率地说,我大多忽视了代码并继续在一般意义上回答。我会去解决这个问题。 – Jon

+1

@DavidKernin:即使对于非静态方法,调用本身的性能差异也是绝对不可测量的。它可能不存在,例如如果调用约定和编译器优化最终导致通过CPU寄存器传递一个或多个参数。 – Jon

0

,你可以肯定地说,考虑到语言规范的唯一的事,如下:structclassunion是在C++中只有3类的类型,这也正是相似structclass之间的由来。

对于其他任何你应该剖析,调试和比较不同的实现和编译器,毕竟C++仍然是一种编译语言,并不是所有的东西都可以说是一个给定的程序,如果你不编译它。

+0

在我的情况下,StructC是一个C结构(也用于C代码)。 – Alterecho

+0

@Alterecho为什么?与_C++ struct_有什么区别?没有这样的区别,C++中的“struct”是'C++'代码。 – user2485710

+0

假设我从另一个C程序中导入StructC? – Alterecho