对象的性能影响 我是一个初学者,在C和C++编程方面有一定的经验。大学派我做一个物理模拟器,所以你可以想象,它非常注重性能
我的问题如下:对象的性能影响 我是一个初学者,在C和C++编程方面有一定的经验。大学派我做一个物理模拟器,所以你可以想象,它非常注重性能,c++,c,performance,C++,C,Performance,我的问题如下: 实例数据成员访问多少条汇编指令 通过指针转换到(例如向量->x) 这比说另一种方法更简单吗 通过字符*(位于变量的同一内存位置)存储 x) ,还是一样 对性能有很大影响吗 如果使用对象访问该内存位置或 如果我只是访问它 关于这个主题的另一个问题是 访问堆内存是否比访问堆栈内存快 进入 这取决于您的目标体系结构。C中的一个结构(以及C++中的一个类)只是一块内存,其中按顺序包含了成员。通过指针访问此类字段意味着向指针添加偏移量并从那里加载。许多体系结构允许负载已经指定到目标地址的
- 这取决于您的目标体系结构。C中的一个结构(以及C++中的一个类)只是一块内存,其中按顺序包含了成员。通过指针访问此类字段意味着向指针添加偏移量并从那里加载。许多体系结构允许负载已经指定到目标地址的偏移量,这意味着没有性能损失;但即使在没有这种功能的极端RISC机器上,添加偏移量也应该非常便宜,以至于负载会完全隐藏它
- 堆栈和堆内存实际上是一回事。只是不同的领域。因此,它们的基本访问速度是相同的。主要区别在于,不管发生什么情况,堆栈很可能已经在缓存中,而如果堆内存最近没有被访问,则堆内存可能不在缓存中
char*
的指针-这两种情况下都是一条指令。有几个地方,C++增加了开销,但它总是给你带来一些灵活性。例如,调用虚拟函数需要额外级别的间接寻址。但是,如果要用函数指针模拟虚拟函数,则无论如何都需要相同的间接寻址;如果要用开关或if
序列模拟虚拟函数,则需要相当数量的CPU周期
通常,在知道要优化代码的哪一部分之前,不应该开始优化。通常,只有一小部分代码负责程序占用的大部分CPU时间。在评测代码之前,您不知道要优化哪个部分。几乎所有的程序员都是程序员的代码,而不是C++语言的特性,这是导致语言速度下降的原因。唯一能确定的方法是分析
在x86上,指针访问通常是一条额外的指令,超出了通常执行操作所需的范围(e.x.y=object->x;
将是一次加载object
中的地址,一次加载x
的值,一次存储到y
——在x86汇编程序中,加载和存储都是带有内存目标的mov
指令)。有时是“零”指令,因为编译器可以优化对象指针的负载。在其他体系结构中,这实际上取决于体系结构的工作方式-一些体系结构访问内存和/或将地址加载到指针等的方式非常有限,这使得访问指针很难
指令数量完全相同-这适用于所有
As#2-对象本身根本没有影响
堆内存和堆栈内存是同一种。一个答案是“堆栈内存总是在caceh中”,如果它“在堆栈顶部附近”,这是正确的,其中所有活动都在进行,但如果您有一个在main
中创建的正在传递的对象,并且使用指向该对象的指针将其传递给多个层次的函数调用,然后通过指针进行访问,那么很明显,该内存很可能已经很长时间没有被使用,因此没有真正的di那里也有冷漠)。最大的区别在于“堆内存很大,堆栈有限”以及“堆耗尽可以进行有限的恢复,堆栈耗尽是执行的立即结束[没有可移植性差的技巧]”
如果您将class
看作C中struct
的同义词(除了一些细节,它们确实是),那么您将意识到class
和对象并没有真正为生成的代码添加任何额外的“工作量”
当然,正确使用,C++可以使你更容易编写代码,处理“用非常类似的方式,但微妙地不同的事情”。在C语言中,您通常会得到:
void drawStuff(Shape *shapes, int count)
{
for(i = 0; i < count; i++)
{
switch (shapes[i].shapeType)
{
case Circle:
... code to draw a circle ...
break;
case Rectangle:
... code to draw a rectangle ...
break;
case Square:
...
break;
case Triangle:
...
break;
}
}
}
void drawStuff(形状*形状,整数计数)
{
对于(i=0;i
C++中,我们可以在对象创建的时候做这个,而你的“拖拽”是:
void drawStuff(标准::矢量形状)
{
用于(自动s:形状)
{
s->Draw();
}
}
“看,妈,没有开关……”
(当然,您确实需要一个开关或一些东西来选择要创建的对象,但是一旦做出选择,假设您的对象和周围的架构都定义得很好,那么一切都应该像上面的示例一样“神奇地”工作)
最后,如果这对性能很重要,那么运行基准测试、运行评测并检查代码在哪里花费时间。不要过早地进行优化(但如果您有严格的性能标准
void drawStuff(std::vector<Shape*> shapes)
{
for(auto s : shapes)
{
s->Draw();
}
}