优化静态字符串的字符串存储

Pat*_*ght 2 c++ string

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

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

int main() {
    foo("Hello World");
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

int main() {
    char[] myString = "Hello World";
    foo(myString);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Yak*_*ont 7

我能想到的最简单的方法是使用用户定义的文字运算符来完成此操作。

struct cow_string { /* stuff */ };

cow_string operator "" _cow( const char*, size_t );
Run Code Online (Sandbox Code Playgroud)

然后,当有人这样做时:

cow_string betsy = "moo"_cow;
Run Code Online (Sandbox Code Playgroud)

的参数operator""_cow保证是静态字符串。我的意思是,除非有人直接通过名字调用这种病态的情况operator""(老实说,我什至不知道这是否可能;如果是,并且你这样做并且它破坏了东西,那么,无论发生什么,你都是罪有应得)。