1. STL容器深度解析与性能优化
STL(Standard Template Library)是C++程序员必须掌握的利器,但很多面试者对其底层实现一知半解。我在技术面试中经常发现,候选人能说出vector和list的区别,但被追问具体场景下的性能差异时就支支吾吾。让我们用实际代码来剖析几个关键点。
1.1 vector的emplace_back与push_back性能对决
先看这段典型面试代码:
cpp复制class DataItem {
public:
DataItem(int id, string name)
: m_id(id), m_name(name) {
cout << "构造 " << this << endl;
}
DataItem(const DataItem& other)
: m_id(other.m_id), m_name(other.m_name) {
cout << "拷贝构造 " << this << endl;
}
DataItem(DataItem&& other) noexcept
: m_id(std::move(other.m_id)), m_name(std::move(other.m_name)) {
cout << "移动构造 " << this << endl;
}
private:
int m_id;
string m_name;
};
void testVector() {
vector<DataItem> vec;
vec.reserve(10);
cout << "--- push_back ---" << endl;
vec.push_back(DataItem(1, "test"));
cout << "--- emplace_back ---" << endl;
vec.emplace_back(2, "demo");
}
运行后会看到明显的性能差异:push_back会先构造临时对象再移动构造,而emplace_back直接原地构造。在百万次操作时,这个差异会导致明显的性能差距。我在实际项目性能优化中,通过将push_back改为emplace_back,使日志处理模块性能提升了15%。
1.2 vector内存管理的三种姿势
面试常问:"如何真正释放vector内存?" 很多人只知道clear(),其实有三种方法:
cpp复制vector<int> bigVec(1000000);
// 方法1:swap技巧(C++98/03常用)
vector<int>().swap(bigVec);
// 方法2:clear+shrink(C++11推荐)
bigVec.clear();
bigVec.shrink_to_fit();
// 方法3:move语义(C++11新特性)
auto temp = std::move(b
