[英]Is the small string optimization undesirable?
在下面的代碼中,我們可以演示與小/大字符串保存在向量中時相關的錯誤(這是因為小字符串可能不會在堆上分配)。
有人可能會爭辯說,這不是標准庫中的錯誤而是程序員的錯,因為引用了可能在重新分配過程中消失的東西。 但是作為程序員,我不應該知道數據結構的內部實現
#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++ 沒有為您提供保護代碼的工具。 如果您需要某些更精細的所有權語義,您可以創建智能指針的容器,並且不同的容器具有不同的迭代器失效規則(由運行時或內存復雜性支付)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.