gpt4 book ai didi

c++ - 使用 `std::string::c_str()` 将 `mkdtemp()` 的结果传递给 `const_cast()`

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:26 24 4
gpt4 key购买 nike

OK,所以:我们都知道一般使用const_cast<>()任何地方都太糟糕了,这实际上是一种编程 war 罪。因此,这是一个关于在特定情况下,究竟有多糟糕的假设性问题。

换句话说:我遇到了一些执行类似操作的代码:

std::string temporary = "/tmp/directory-XXXXX";
const char* dtemp = ::mkdtemp(const_cast<char*>(temporary.c_str()));
/// `temporary` is unused hereafter

……现在,我遇到了很多关于如何获得对 std::string 的底层缓冲区的可写访问权限的描述。实例(q.v. https://stackoverflow.com/a/15863513/298171 例如)——它们都有一个警告,是的,这些方法不能保证按任何 C++ 标准工作,但实际上它们都可以。

考虑到这一点,我只是好奇如何使用 const_cast<char*>(string.c_str())与其他已知方法(例如前面提到的 &string[0] , &c)相比……我问是因为我发现使用这种方法的代码在实践中似乎运行良好,我想在我尝试之前我会看看专家的想法不可避免的const_cast<>() -免费重写。

最佳答案

  • const不能在硬件级别强制执行,因为在实践中,在非假设环境中,您只能将只读属性设置为完整的 4K 内存页面,并且路上有大页面,这大大减少了 CPU 在 TLB 中的查找未命中率。 .

  • const不会像 __restrict 那样影响代码生成从 C99 开始。事实上,const ,粗略地说,意思是“中毒所有对此数据的写入尝试,我想在这里保护我的不变量”

std::string是一个可变字符串,它的底层缓冲区不能在只读内存中分配。所以const_cast<>除非您要更改底层缓冲区边界之外的某些字节或尝试 delete,否则不应在此处导致程序崩溃。 , free()realloc()某物。但是,更改缓冲区中的字符可能被归类为不变违规。因为你不使用 std::string之后的实例并简单地将其丢弃除非某些特定的std::string否则这不应该引起程序崩溃实现决定在销毁之前检查其不变量的完整性,如果其中一些被破坏,则强制崩溃。因为这样的检查不能在少于 O(N) 的时间内完成并且 std::string是一个性能关键类,任何人都不可能完成。

另一个问题可能来自Copy-on-Write战略。因此,通过直接修改缓冲区,您可能会破坏其他一些 std::string与您的字符串共享缓冲区的实例。但几年前,大多数 C++ 专家得出结论,COW 太脆弱且太慢,尤其是在多线程环境中,因此现代 C++ 库不应该使用它,而是坚持尽可能使用移动构造并避免堆流量小适用的长度字符串。

关于c++ - 使用 `std::string::c_str()` 将 `mkdtemp()` 的结果传递给 `const_cast<char*>()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34127005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com