结构与类的表现

时间:2011-03-25 12:54:26

标签: c++ performance class struct

我想知道是否在C ++中使用g ++ -O3选项对类和C样式结构进行性能比较。有关于此的任何基准或比较。我一直认为C ++类比结构更重,也可能更慢(编译时间对我来说不是很重要,运行时间更重要)。我将实现一个B树,我应该为了性能而使用类或结构来实现它。

7 个答案:

答案 0 :(得分:51)

在运行时级别,C ++ 中的结构和类之间没有区别。 因此,无论您在代码中使用struct A还是class A,都不会产生任何性能差异。

另外,使用某些功能 - 比如构造函数,析构函数和虚函数 - 可能会有一些性能损失(但如果你使用它们,你可能还是需要它们)。但是你可以同样成功地在你的类或结构中使用它们。

this document中,您可以阅读有关C ++的其他与性能相关的细微之处。

答案 1 :(得分:19)

在C ++中,struct是默认情况下成员公开的类的语法糖。

答案 2 :(得分:8)

我的诚实意见......在实际表现出问题之前不要担心性能,然后对代码进行分析。过早优化是万恶之源。但是,正如其他人所说,在运行时C ++中的结构和类之间没有区别。

答案 3 :(得分:3)

专注于创建有效的数据结构和有效的逻辑来操纵数据结构。 C ++类本身并不比C风格的结构慢,所以不要限制你的设计。

答案 4 :(得分:2)

AFAIK,从性能的角度来看,它们在C ++中是等效的。

他们的不同之处在于,例如,结构成员的结构成员是公共的,例如。

MY2C

答案 5 :(得分:1)

做一个实验,人们!

以下是我设计的实验代码:

#include <iostream>
#include <string>
#include <ctime>
using namespace std;
class foo {
  public:
    void foobar(int k) {
      for (k; k > 0; k--) {
        cout << k << endl;
      }
    }
    void initialize() {
      accessor = "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf";
    }
    string accessor;
};
struct bar {
  public:
    void foobar(int k) {
      for (k; k > 0; k--) {
        cout << k << endl;
      }
    }
    void initialize() {
      accessor = "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf";
    }
    string accessor;
};

int main() {
  clock_t timer1 = clock();
  for (int j = 0; j < 200; j++) {
    foo f;
    f.initialize();
    f.foobar(7);
    cout << f.accessor << endl;
  }
  clock_t classstuff = clock();
  clock_t timer2 = clock();
  for (int j = 0; j < 200; j++) {
    bar b;
    b.initialize();
    b.foobar(7);
    cout << b.accessor << endl;
  }
  clock_t structstuff = clock();
  cout << "struct took " << structstuff-timer2 << endl;
  cout << "class took " << classstuff-timer1 << endl;
  return 0;
}

在我的计算机上,struct占用了1286个时钟周期,而类占用了1450个时钟周期。要回答你的问题,struct稍快一点。但是,这并不重要,因为这些天计算机如此之快。

答案 6 :(得分:-1)

实际上,结构在时间和内存方面都比类更好(例如,结构数组与对象数组),

  

有一个巨大的   效率差异   一些案例。而   对象的开销   可能看起来不太像   很多,考虑一个数组   对象并进行比较   到一个结构数组。   假设数据   结构包含16   数据字节,数组   长度是1,000,000,并且   这是一个32位系统。   对于对象数组   总空间使用量是:   8字节数组溢出   (4字节指针大小×   ((8字节开销+   = 28 MB   对于数组结构,   结果是   截然不同:   8字节数组溢出   (16字节数据×1,00   = 16 MB   通过64位进程,   对象数组接管   40 MB而结构   阵列仍然只需要16   MB。

有关详细信息,请参见this article