假设有一个类B
,它有一个指向类A
对象的指针的智能指针成员。那么,在成员初始化器列表中初始化智能指针成员的缺点是什么?我知道初始化比赋值快(这里会重置(,但我不知道缺点。在成员初始值设定项列表中初始化智能指针的缺点是什么?
#include <chrono>
#include <iostream>
#include <memory>
struct A {
};
struct B1 {
B1(): a(new A) {}
std::unique_ptr<A> a;
};
struct B2 {
B2() {
a.reset(new A);
}
std::unique_ptr<A> a;
};
int main() {
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
for(auto i=0; i < 100000; ++i) {
B1 b;
// B2 b;
}
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::cout << (end - begin).count() << std::endl;
}
B1:8054043,B2:8894576
没有缺点,您应该在成员初始值设定项列表中初始化它。然而,我怀疑它是否会对性能产生任何影响。(你的测试不起作用。它要么在没有启用优化的情况下完成,要么测量随机噪声。(
但是,通常建议不要直接使用new
,而是使用std::make_unique
。
此外,如果要初始化的值不依赖于构造函数的参数,那么使用默认初始化器可能是更好的方法:
struct B1 {
std::unique_ptr<A> a = std::make_unique<A>();
};