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。
我发现的唯一缺点是更高的内存使用率(因为对象是在第一次调用函数时构建的,并且仅在程序结束时才销毁)。
另一件事是,具有无状态功能被认为是一种“更好”的做法,但是我真的不认为这种行为可以被视为“状态”。
编辑:我只是想指出,我计算出的值在函数之外是没有意义的,否则它们可能是封闭类的字段或其他任何东西,但它们从未在其他地方使用。
你怎么看?
是的,一点没错!
与以往一样,您已经确定了一个折衷方案。
但这是完全正常和明智的事情。如果您不需要每次都计算这些值,则不需要。
在这种特殊情况下,除非您强烈需要延迟实例化(也许并非每次运行都调用函数,并且您认为这些初始化太“繁重”而无法执行),否则我可能会使这些项目成为封装类的静态成员。您不需要它们)。
实际上,这将使整个功能getEndPointUrl()过时。成为公共成员常量!您认为常量“在其他任何地方都没有使用”的理由有点循环。您可以在任何地方使用数据getEndPointUrl()。
| 归档时间: |
|
| 查看次数: |
284 次 |
| 最近记录: |