【问题标题】:Optimized string storage for static strings为静态字符串优化字符串存储
【发布时间】:2022-07-28 23:34:29
【问题描述】:

我知道在 C/C++ 中,如果你编写一个字符串文字,它实际上是放在具有静态(程序生命周期)存储的只读内存中。所以,例如:

void foo(const char* string) {
    std::cout << static_cast<void*>(string) << std::endl;
}

int main() {
    foo("Hello World");
}

应该打印出指向只读内存中某个位置的指针。

这是我的问题,假设我想编写一个 copy-on-write String 类,它对这样的静态数据进行了优化。与其将整个字符串复制到动态分配的内存中(这很昂贵),不如只保留一个指向静态数据的指针。然后,如果确实需要进行写入,那么我可以在那个时候进行复制。

但是我如何判断一个字符串是静态的还是类似的:

int main() {
    char[] myString = "Hello World";
    foo(myString);
}

在这种情况下,myString 位于堆栈而不是堆中,因此它的生命周期不是静态的。

我的第一个想法是std::string_view 的特殊构造函数,但我不确定std::string_view 是否意味着具有静态生命周期的字符串...

【问题讨论】:

  • 存储说明符不是对象类型的一部分。除非您知道有关它将在不同持续时间内存储指针的实现的详细信息,否则无法从指针中知道它指向的位置。
  • 应该打印出指向只读内存中某个位置的指针 sn-p 中的代码不会编译。

标签: c++ string


【解决方案1】:

我能想到的最简单的方法是使用用户定义的文字运算符。

struct cow_string { /* stuff */ };

cow_string operator "" _cow( const char*, size_t );

然后,当有人这样做时:

cow_string betsy = "moo"_cow;

operator""_cow 的参数保证为静态字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    相关资源
    最近更新 更多