【发布时间】: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 中的代码不会编译。