【问题标题】:Can we take a const ref of a substring?我们可以获取子字符串的 const ref 吗?
【发布时间】:2019-12-14 04:40:45
【问题描述】:

我有一个类,其中包含一个字符串作为私有成员。该类具有公共成员函数,它们都将 const ref 返回到 std::wstring。

所有返回的 const-ref 字符串都是私有成员的子字符串。

我可以将每个子字符串存储为成员,然后将 const refs 返回给这些成员,但这不是最优的,因为它会复制内存。

假设我确实存储了足够的内存来知道每个子字符串的开始和结束索引。

如何在不复制任何成员字符串的情况下实现上述类?

【问题讨论】:

标签: c++ c++17 stdstring flyweight-pattern


【解决方案1】:

这是不合法的,它不会为您节省任何东西。 std::string::substr 按值返回。这意味着无论您如何返回它,它都会从类成员中复制数据。当您返回对它的引用时,您将返回对临时本地对象的引用。 const 引用生命周期扩展规则在这里不起作用,您在调用站点留下的只是一个悬空引用。

您可以做的只是按值返回。默认情况下,这将导致移动,编译器可以很容易地通过将临时构造直接省略到调用站点中的对象中来优化它。

另一种选择是拥有一个std::string_view 成员,并从中返回子字符串。这样做只需要复制一个指针和一个整数,因此速度会非常快。

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多