访问者是否会影响应用程序的性能?

igo*_*gor 5 c++ performance

我想知道访问器的使用是否会显着影响应用程序的性能.假设我们有一个Point类,有两个私有字段.我们可以通过调用GetX()等公共函数来访问这些字段.

class Point
{
public:
    Point(void);
    double GetX();
    double GetY();
    void SetX(double x);
    void SetY(double y);

    ~Point(void);

private:
    double x,y;
};
Run Code Online (Sandbox Code Playgroud)

但是,如果我们需要获得字段xa的大量时间值(例如,如果我们处理图像),这种结构是否会影响应用程序的性能?也许将字段x和y公开会更快?

Tom*_*Tom 5

首先,这可能是过早的优化,并且在一般情况下,访问者不是应用程序级瓶颈的来源.然而,他们并不是神奇的小精灵尘埃.这通常不是存取会伤害性能的情况下.有几点需要考虑:

如果实现是inline或者如果您有一个支持链接时优化的工具链,则可能会产生0影响.下面是一个可以让你得到一个例子绝对对不吸编译器相同的性能.

class Point {
    public: double GetX() const;
    private: double x;
};
inline double Point::GetX() const { return x; }
Run Code Online (Sandbox Code Playgroud)

如果实现是脱节的,那么您将增加函数调用的成本.如果,如你所说,函数被多次调用,那么至少代码或多或少保证在缓存中,但开销的相对百分比可能很高:执行函数调用的工作高于移动double周围的工作,并且有一个指针间接,因为该函数实际上this用作参数.

如果实现既是脱节的是可重定位库(Linux*.so或Windows*.dll)的一部分,那么为了管理重定位,还会出现一个额外的间接.

相对于x86 32位,x86-64硬件上的后两种成本都降低了; 这么多,你不应该担心它.我不能谈论其他架构.

倒数第二,如果你有许多具有琐碎的getter和setter的琐碎对象,并且如果你没有配置文件引导的优化或链接时优化,由于大量的微小函数可能会有缓存效果.每个函数可能需要至少一个缓存行,并且这些函数不会以将常用部分组合在一起的方式自然地组织.除非你正在编写一个非常大规模的C++项目或核心组件,例如KDE基础系统,否则这个成本是你应该忽略的.

最终,不要担心.


Cro*_*yer 4

此类方法应始终由编译器内联,其性能与公开它们相同。您可以使用 inline 关键字来帮助编译器,但这只是一个提示。如果避免函数调用开销确实很重要,请读取生成的程序集。如果他们内联了,那就没问题了。否则,您可能需要考虑放松它们的可见性。