“&s[0]”是否引用 std::string 中的连续字符?
在 C 中,使用“&s[0]” " 访问 std::string 的第一个字符是一种常见的做法,但在这种情况下,人们对其安全性产生了担忧。了解 std::string 的底层存储方案对于解决这个问题至关重要。
C 98/03 标准没有强制 std::string 分配连续存储,使得实现可以使用碎片内存。然而,随着 C 11 的出现,连续存储成为 std::string 的强制要求。
在实践中,不太可能遇到偏离连续存储方法的实现。正如 Herb Sutter 承认的那样,没有已知的实现违反此约定。
因此,使用“&s[0]”引用 std::string 的第一个字符在 C 98/03 和 C 11 中都是安全的。 C 11 标准明确保证了这种行为,即使对于零长度字符串也是如此。这从operator[]的定义中可以明显看出:
Returns: *(begin() + pos) if pos < size(), otherwise a reference to an object of type T with value charT(); the referenced value shall not be modified
此外,data()函数定义为:
Returns: A pointer p such that p + i == &operator[](i) for each i in [0, size()].
这些定义确认了通过“&s”获得的引用[0]”指向字符串中的有效字符,在现代 C 实现中默认情况下该字符是连续的。
以上是`&s[0]` 是访问 C 中 std::string 的第一个字符的安全方法吗?的详细内容。更多信息请关注PHP中文网其他相关文章!