c++ - 优化静态字符串的字符串存储

标签 c++ string

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

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

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

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

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

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

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

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

我首先想到的是 std::string_view 的特殊构造函数,但我不确定 std::string_view 是否暗示了一个具有静态生命周期的字符串。 .

最佳答案

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

struct cow_string { /* stuff */ };

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

然后,当有人这样做时:

cow_string betsy = "moo"_cow;

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

关于c++ - 优化静态字符串的字符串存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73155412/

相关文章:

python - 在 python 中查找子字符串

c++ - clang --version 权限被拒绝错误

c++ - 使用 C++ 在 Linux 中使用系留相机应用程序

java - 即使字符串池中已有可用的对象,字符串追加也会花费更多时间

java - 使用另一个哈希函数处理冲突?

c# - 测试字符串中的重复字符

c++ - 字符串到字符串构建函数,为每个字符串使用不同的索引变量

C++如何将argv作为字符串保存到 vector

c++ - 使用带有插入排序的结构

c++ - 在 C++ 中遍历目录树