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