我应该在函数中使用静态变量来防止重新计算值吗?

Tho*_*ski 9 c++ performance member-functions variable-declaration

我已经写了一段时间的C ++代码,但是一段时间以来,我一直在想一些事情,而没有找到一个明确的答案。

我的意思是:假设我有一个函数(可以是方法,可以是static,但不一定),并且该函数使用一些“重”对象(例如无法确定的字符串)在编译时很容易,但这在整个执行过程中是恒定的)。我实际遇到的一个示例如下:

/* Returns an endpoint for an API
 * Based on the main API URL (getApiUrl())
 */
virtual QString getEndPointUrl() const override
{
    QString baseUrl = getApiUrl();
    QString endpointUrl = QString("%1/%2").arg(baseUrl, "endpoint");
    return endpointUrl;
}
Run Code Online (Sandbox Code Playgroud)

当然,这只是一个例子(我知道QStrings具有自己独特的Qt内存管理功能,但是让我们承认我们正在处理基本对象)。

执行以下操作是一个好主意吗?

virtual QString getEndPointUrl() const override
{
    /* We determine baseUrl only once */
    static const QString baseUrl = getApiUrl();
    /* We compute endpointUrl only once */
    static const QString endpointUrl = QString("%1/%2").arg(baseUrl, "endpoint");
    return endpointUrl;
}
Run Code Online (Sandbox Code Playgroud)

您可能已经猜到了,这里的想法是不要在每次执行时都确定URL getEndPointUrl

我发现的唯一缺点是更高的内存使用率(因为对象是在第一次调用函数时构建的,并且仅在程序结束时才销毁)。

另一件事是,具有无状态功能被认为是一种“更好”的做法,但是我真的不认为这种行为可以被视为“状态”。

编辑:我只是想指出,我计算出的值在函数之外是没有意义的,否则它们可能是封闭类的字段或其他任何东西,但它们从未在其他地方使用。

你怎么看?

Lig*_*ica 7

是的,一点没错!

与以往一样,您已经确定了一个折衷方案。

但这是完全正常和明智的事情。如果您不需要每次都计算这些值,则不需要。

在这种特殊情况下,除非您强烈需要延迟实例化(也许并非每次运行都调用函数,并且您认为这些初始化太“繁重”而无法执行),否则我可能会使这些项目成为封装类的静态成员。您不需要它们)。

实际上,这将使整个功能getEndPointUrl()过时。成为公共成员常量!您认为常量“在其他任何地方都没有使用”的理由有点循环。您可以在任何地方使用数据getEndPointUrl()

  • 为什么使用静态成员而不是普通成员?创建类的另一个实例时要避免重构? (2认同)

Pau*_*ans 1

这取决于您的背景。正如您正确指出的那样,您正在以内存使用换取速度。那么,在您的背景下,什么更重要(如果有的话)?您是否处于低延迟程序的热门路径上?您使用的是低内存设备吗?