小字符串优化是否不可取?

Sou*_*mar -3 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();

}
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 9

但是作为程序员,我不应该知道数据结构的内部实现

您应该了解所使用的标准库中数据结构的迭代器无效规则。它们是每个容器的公共合同的一部分,并且可以很容易地推断出何时可以使用对标准库容器中某些内容的迭代器/引用/指针而不会产生不确定行为的风险。

它与任何处理其他内容的语言中的其他接口没有什么不同。只要满足某些条件,该手柄才有效。

C ++似乎并没有为您提供保护代码的工具。如果需要某些更精细的所有权语义,并且不同的容器具有不同的迭代器无效规则(由运行时或内存复杂性支付),则可以创建智能指针容器。

  • @SoulimaneMammar-通过什么理论?您还应该注意,您不知道是否以及何时进行迁移。当您使用某些操作时,引用无效。您可以了解有关实现的某些事实,并不意味着您不能仅根据合同进行编程。 (3认同)
  • @ t.niese-确实如此。规则使对“ std :: shared_ptr”的任何句柄无效,但它对指针没有影响,因为这是共享指针的设计目标。指针断开连接。`std :: string`不是那样设计的。此外,迭代器失效规则无非是正式尝试将您直观描述的内容编成代码。 (2认同)