c++ - 小字符串优化是不可取的吗?
问题描述
在下面的代码中,我们可以演示一个与将小/大字符串保存在向量中时相关的错误(这是因为小字符串可能不会在堆上分配)。
有人可能会争辩说,这不是标准库中的错误,而是程序员的错,因为引用了可能在重新分配过程中消失的东西。但作为一名程序员,我不应该知道数据结构的内部实现
#include<iostream>
#include<vector>
int main()
{
std::vector<std::string> v;
v.push_back("123456789abcdefg"); //bug if less than 16 characters
const char* first = v[0].c_str();
for (auto s : { "hi","guys" })
v.push_back(s);
std::cout << first << std::endl;
std::cin.get();
}
解决方案
但作为一名程序员,我不应该知道数据结构的内部实现
您应该了解您使用的标准库中数据结构的迭代器失效规则。它们是每个容器的公共合同的一部分,并且可以很容易地推断出何时可以使用指向标准库容器中某些内容的迭代器/引用/指针,而不会出现未定义行为的风险。
它与任何其他语言的任何其他接口都没有什么不同,它可以为某物分配句柄。只有满足某些条件,句柄才会有效。
并不是说 C++ 没有为您提供保护代码的工具。如果您需要某些更复杂的所有权语义,您可以创建智能指针容器,并且不同的容器具有不同的迭代器失效规则(由运行时或内存复杂性支付)。
推荐阅读
- ansible - 在 hosts 文件中定位 Ansible 嵌套子组
- r - 用重复名称加长数据框
- swift - 如果 GeoFire 在您所在地区找到人,请设置 Pin 图
- c# - Xamarin.Forms 所选项目为空
- python-3.x - 在 CalibratedClassifierCV 内使用管道分类器
- objective-c - 在 Objective-C 测试中测试 Swift 的问题
- xslt - 使用 XSLT 使用属性值更改元素名称
- smartsheet-api - 没有这样的主机是已知的 (api.smartsheet.com) - Java SDK
- functional-programming - 累积错误的结果生成器
- django - Django用m2m字段保存表单