面试题答案
一键面试初始化顺序
在创建 Outer<ComplexType>
对象时,innerObj1
和 innerVec
中元素的初始化顺序如下:
- 首先,按照类中成员变量声明的顺序进行初始化。所以
innerObj1
会先被初始化。 - 接着,
innerVec
中的元素会按照vec
中元素的顺序被初始化。
优化初始化性能
当 ComplexType
构造开销较大时,可以考虑以下几种优化方式:
- 使用移动语义:如果
ComplexType
支持移动构造函数,可以在Outer
的构造函数中使用std::move
来避免不必要的拷贝。例如:
template <typename T>
class Outer {
public:
T innerObj1;
std::vector<T> innerVec;
Outer(T&& val1, std::vector<T>&& vec) : innerVec(std::move(vec)), innerObj1(std::move(val1)) {}
};
- 减少构造次数:如果可能,尽量在构造
Outer
对象之前,预先构造好ComplexType
对象,避免在std::vector
初始化过程中频繁构造。 - 使用
emplace_back
:在构造innerVec
时,使用emplace_back
代替push_back
。emplace_back
会直接在vector
中构造对象,避免额外的拷贝或移动。例如:
template <typename T>
class Outer {
public:
T innerObj1;
std::vector<T> innerVec;
Outer(const T& val1, const std::vector<T>& vec) : innerObj1(val1) {
for (const auto& v : vec) {
innerVec.emplace_back(v);
}
}
};
- 考虑使用
std::vector
的 reserve 方法:在添加元素到innerVec
之前,使用reserve
方法预先分配足够的空间,减少动态内存分配的次数。例如:
template <typename T>
class Outer {
public:
T innerObj1;
std::vector<T> innerVec;
Outer(const T& val1, const std::vector<T>& vec) : innerObj1(val1) {
innerVec.reserve(vec.size());
for (const auto& v : vec) {
innerVec.emplace_back(v);
}
}
};