结构体与类的性能表现比较

33

我想知道在使用 g++ -O3 选项时,C++ 类和 C 风格结构体的性能比较情况。是否有对此进行基准测试或比较的数据?一直以来,我认为 C++ 类比结构体更沉重,也可能更慢(编译时间对我来说不是很重要,运行时间更关键)。我将实现一个 B 树,为了性能考虑,应该使用类还是结构体?


5
你最爱哪一个亲生孪生兄弟/姐妹? - David Rodríguez - dribeas
2
实际上,我从未使用过C++结构体的高级功能,我一直将它们用作公共数据的数据容器,就像C结构体一样。当我需要继承、多态等复杂功能时,我更喜欢使用类。因此,这不是一种爱恨关系。 - systemsfault
7个回答

59
在C ++中,在运行时级别上,结构体和类之间没有任何区别,完全相同。因此,在您的代码中使用struct Aclass A不会产生任何性能差异。
另一件事是使用某些功能,例如构造函数、析构函数和虚函数,可能会有一些性能惩罚(但如果您使用它们,您可能需要它们)。但无论在类还是结构体内部都可以同样成功地使用它们。
这个文档中,您可以了解关于C++的其他与性能相关的微妙问题。

你知道关于结构体和类的内存消耗方面有哪些文档或基准测试吗? - systemsfault
11
再次强调:在运行时,结构体和类的性能和内存消耗没有区别。你可以把它们视为相同事物的不同关键字,只是默认成员访问权限和默认继承模式不同(在模板参数列表中不能使用“struct”,但你的问题不是关于这个的,对吧?) - Alexander Poluektov
在C语言中的结构体是否比C++中的结构体更快? - Nanashi No Gombe

26
在C++中,struct是类的语法糖,其成员默认为公共访问权限。

12
换个角度看,struct 是向后兼容 C 语言的语法,而 class 则是更符合面向对象编程风格的语法糖,用以定义默认为私有访问控制的类成员。 - Steve Jessop
9
如果可能的话,我希望你能给这个答案点赞 +1,000,000(只是略微夸张一下;)),因为导致原始问题的误解非常普遍。所以,大家跟着我一起重复:“**structclass是等价的**(除了默认访问权限)”。 - Fabio Fracassi
2
我不吃糖。我能有一个无糖结构体吗? - Simple Fellow
我想知道如果“struct”语法仅限于PODS,那么语言的演变会受到什么影响,如果适用于PODS的保证仅适用于声明为“struct”的类型呢?添加一个新关键字,其基本意思与“struct”和“private”的组合相同,似乎有些浪费。 - supercat

12

我真诚的意见是...不要担心性能,直到它真正成为问题,然后对你的代码进行剖析。过早的优化是万恶之源。但是,正如其他人所说,在C++中结构体和类在运行时没有区别。


3

注重创建高效的数据结构和高效的逻辑来操作数据结构。C++类并不比C风格的结构体慢,因此不要让这限制你的设计。


6
他明确询问的是类和结构体之间的区别,而不是关于软件设计方面的建议。 - Tara

2

据我所知,在C++的性能方面,它们是等效的。

它们的区别在于像结构体成员默认情况下具有公共访问权限这样的语法糖。

以上仅为个人意见。


0

只要做一个实验,就能明白了,各位!

这里是我设计的实验代码:

#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;
}

在我的电脑上,结构体花费了1286个时钟滴答,而类花费了1450个时钟滴答。回答你的问题,结构体略微更快。但是这并不重要,因为现在的计算机速度非常快。

2
实际上,这个测试可能不是最优的,第一个测试所需的时间通常比第二个长,因为处理器需要准备执行。最好在进行测量之前多次运行两个循环,并避免使用IO,因为它会显著影响测量精度。我对你的测试进行了一些更改,我的结果表明两者性能相同,有时一个稍微快一些,另一个稍微慢一些,即:(类:1116、530、523、507)(结构:1087、498、541、543)。 - VinGarcia
我的原始代码是用来做那个的,但我不小心删除了它,所以我只是写了一些快速而且不太规范的代码进行提交 :) - ndrewxie

-3

其实在某些情况下,结构体比类更高效,无论是时间还是内存(例如结构体数组与对象数组的比较)。

有时效率差异很大。虽然一个对象的开销可能看起来不算太大,但是考虑一下对象数组和结构体数组之间的比较。假设数据结构包含 16 字节数据,数组长度为 1,000,000,这是一个32位系统。 对于对象数组,总空间使用情况为:8字节数组开销(4字节指针大小×(8字节开销+16字节数据))= 28 MB。 对于结构体数组,结果截然不同:8字节数组开销(16字节数据×1,000,000)= 16 MB。使用64位进程时,对象数组需要超过40MB,而结构体数组仍然只需要16MB。

详见this article


这篇文章里有一个很大的C#标志,不知道你是怎么错过它的,这个Stack Overflow的问题是关于C++的类和结构体的。 - 0xdeadbeef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接