【发布时间】:2019-10-28 00:12:36
【问题描述】:
我已经编写 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;
}
这当然只是一个例子(我知道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;
}
您可能已经猜到了,这里的想法是不要在每次执行 getEndPointUrl 时确定 URL。
我发现的唯一缺点是内存使用率较高(因为对象是在第一次调用函数时构建的,并且仅在程序结束时才销毁)。
另一件事是,拥有无状态函数被认为是一种“更好”的做法,但我真的不认为这种行为可以被称为“状态”。
编辑:我只是想指出我计算的值在函数之外是没有意义的,否则它们可能是封闭类的字段或其他任何东西,但它们从未在其他任何地方使用。
你有什么想法?
【问题讨论】:
-
如果不是静态函数,我会计算构造函数中的值。也许它稍后会在另一个函数中使用。
-
我同意这不符合“状态”的条件,我也认为这完全没问题,但我感觉这将作为“主要基于意见”而关闭。
-
你的虚函数是在一个类中声明的,不是吗?在调用函数的任何地方都使用 endpointUrl。将 endpointUrl 存储在您的虚函数所在的类中是有意义的。我不会使用静态变量。在程序结束 imo 之前保留它是没有意义的。
-
@MFnx 我认为使函数虚拟化的目的是能够在派生类中覆盖它(并可能使结果更加动态)。你不能用成员变量来做到这一点。
-
@molbdnilo - 你也不能用静态来做到这一点。重写虚函数是关于根据对象的实际类型改变调用该函数的行为。使用类的成员变量不一定与此相关。
标签: c++ performance variable-declaration member-functions