我知道在 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/