我想知道在使用 g++ -O3 选项时,C++ 类和 C 风格结构体的性能比较情况。是否有对此进行基准测试或比较的数据?一直以来,我认为 C++ 类比结构体更沉重,也可能更慢(编译时间对我来说不是很重要,运行时间更关键)。我将实现一个 B 树,为了性能考虑,应该使用类还是结构体?
我想知道在使用 g++ -O3 选项时,C++ 类和 C 风格结构体的性能比较情况。是否有对此进行基准测试或比较的数据?一直以来,我认为 C++ 类比结构体更沉重,也可能更慢(编译时间对我来说不是很重要,运行时间更关键)。我将实现一个 B 树,为了性能考虑,应该使用类还是结构体?
struct A
或class A
不会产生任何性能差异。struct
是类的语法糖,其成员默认为公共访问权限。struct
是向后兼容 C 语言的语法,而 class
则是更符合面向对象编程风格的语法糖,用以定义默认为私有访问控制的类成员。 - Steve Jessopstruct
和class
是等价的**(除了默认访问权限)”。 - Fabio Fracassi我真诚的意见是...不要担心性能,直到它真正成为问题,然后对你的代码进行剖析。过早的优化是万恶之源。但是,正如其他人所说,在C++中结构体和类在运行时没有区别。
注重创建高效的数据结构和高效的逻辑来操作数据结构。C++类并不比C风格的结构体慢,因此不要让这限制你的设计。
据我所知,在C++的性能方面,它们是等效的。
它们的区别在于像结构体成员默认情况下具有公共访问权限这样的语法糖。
以上仅为个人意见。
只要做一个实验,就能明白了,各位!
这里是我设计的实验代码:
#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;
}
其实在某些情况下,结构体比类更高效,无论是时间还是内存(例如结构体数组与对象数组的比较)。
有时效率差异很大。虽然一个对象的开销可能看起来不算太大,但是考虑一下对象数组和结构体数组之间的比较。假设数据结构包含 16 字节数据,数组长度为 1,000,000,这是一个32位系统。 对于对象数组,总空间使用情况为:8字节数组开销(4字节指针大小×(8字节开销+16字节数据))= 28 MB。 对于结构体数组,结果截然不同:8字节数组开销(16字节数据×1,000,000)= 16 MB。使用64位进程时,对象数组需要超过40MB,而结构体数组仍然只需要16MB。
详见this article。