【发布时间】:2010-09-16 23:25:26
【问题描述】:
当我使用多个嵌套结构/类(有点像使用多维堆数组)时是否有任何性能损失,或者它只是语言的一种组织特性,可以更容易地跟踪数据而编译器没有真的看出什么不同了吗?
谢谢
【问题讨论】:
标签: c++ performance data-structures
当我使用多个嵌套结构/类(有点像使用多维堆数组)时是否有任何性能损失,或者它只是语言的一种组织特性,可以更容易地跟踪数据而编译器没有真的看出什么不同了吗?
谢谢
【问题讨论】:
标签: c++ performance data-structures
不是真的。类/结构只是在内存中定义偏移量,所以如果你在类中的类中有一个类,编译器只是将偏移量相加。
一旦有了指针(每个指针取消引用都是内存读取和潜在的 L2 缓存未命中)或虚拟函数(非常糟糕,尤其是在较旧的 CPU 上),性能就会发挥作用。
编辑:我应该注意的一件事 - 如果您正在开发一个性能不是绝对重要的应用程序,请关注良好的类设计而不是性能。虽然当您编写需要以 60fps 运行的内容时,L2 缓存未命中之类的事情会产生很大的影响,但在普通桌面应用程序中却没有什么意义。
【讨论】:
不应该有任何性能或内存损失。它们只是让程序员更轻松的语法糖。
【讨论】:
简短回答:不。
【讨论】:
大多数情况下没有,正如其他人所提到的。但是,有一个小例外:相对于将相同的原语直接放入单个结构中,由于对齐问题,将结构放入结构中可能会导致较小的内存使用损失。从理论上讲,这可能会导致缓存未命中,从而损害性能。例如:
#include <iostream>
using namespace std; // So sue me
struct A {
double d;
int i;
};
struct B {
int j;
int k;
int l;
};
struct AB {
A a;
B b;
};
struct C {
double d;
int i;
int j;
int k;
int l;
};
int main() {
cout << sizeof(AB) << endl; // 32
cout << sizeof(C) << endl; // 24
}
【讨论】: