Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象的性能影响 我是一个初学者,在C和C++编程方面有一定的经验。大学派我做一个物理模拟器,所以你可以想象,它非常注重性能_C++_C_Performance - Fatal编程技术网

对象的性能影响 我是一个初学者,在C和C++编程方面有一定的经验。大学派我做一个物理模拟器,所以你可以想象,它非常注重性能

对象的性能影响 我是一个初学者,在C和C++编程方面有一定的经验。大学派我做一个物理模拟器,所以你可以想象,它非常注重性能,c++,c,performance,C++,C,Performance,我的问题如下: 实例数据成员访问多少条汇编指令 通过指针转换到(例如向量->x) 这比说另一种方法更简单吗 通过字符*(位于变量的同一内存位置)存储 x) ,还是一样 对性能有很大影响吗 如果使用对象访问该内存位置或 如果我只是访问它 关于这个主题的另一个问题是 访问堆内存是否比访问堆栈内存快 进入 这取决于您的目标体系结构。C中的一个结构(以及C++中的一个类)只是一块内存,其中按顺序包含了成员。通过指针访问此类字段意味着向指针添加偏移量并从那里加载。许多体系结构允许负载已经指定到目标地址的

我的问题如下:

  • 实例数据成员访问多少条汇编指令 通过指针转换到(例如向量->x)
  • 这比说另一种方法更简单吗 通过字符*(位于变量的同一内存位置)存储 x) ,还是一样
  • 对性能有很大影响吗 如果使用对象访问该内存位置或 如果我只是访问它
  • 关于这个主题的另一个问题是 访问堆内存是否比访问堆栈内存快 进入
    • 这取决于您的目标体系结构。C中的一个结构(以及C++中的一个类)只是一块内存,其中按顺序包含了成员。通过指针访问此类字段意味着向指针添加偏移量并从那里加载。许多体系结构允许负载已经指定到目标地址的偏移量,这意味着没有性能损失;但即使在没有这种功能的极端RISC机器上,添加偏移量也应该非常便宜,以至于负载会完全隐藏它
    • 堆栈和堆内存实际上是一回事。只是不同的领域。因此,它们的基本访问速度是相同的。主要区别在于,不管发生什么情况,堆栈很可能已经在缓存中,而如果堆内存最近没有被访问,则堆内存可能不在缓存中

    C++是一种编译语言。通过指针访问内存位置是相同的,无论它是指向对象的指针还是指向
    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();
       }
    }