显式默认析构函数是否会禁用移动语义影响CDerived类性能?
显式默认析构函数对移动语义的影响及属性判定
首先明确核心问题的答案:用=default声明的析构函数属于用户声明的析构函数,并非编译器自动隐式生成的版本。
接下来解释这会对移动语义产生的影响:
- 根据C++标准规则,一旦类中存在用户声明的析构函数(哪怕是显式默认的版本),编译器就不会自动为该类生成移动构造函数和移动赋值运算符。
- 这意味着当你尝试对
CDerived对象执行移动操作时,编译器会退而调用拷贝构造/赋值函数。如果类包含大量资源(比如动态分配内存、容器等),拷贝操作的开销会远大于移动,直接影响性能。
回到你给出的代码示例:
class CDerived : public CBase { public: CDerived(); virtual ~CDerived() = default; // 这是用户声明的析构函数 virtual void DoStuff(); };
这里的~CDerived() = default虽然让编译器生成默认的析构逻辑,但它本质上是用户主动声明的析构函数,触发了上述规则,导致移动语义被禁用。如果需要保留移动优化,你需要显式默认移动构造和赋值运算符:
class CDerived : public CBase { public: CDerived(); virtual ~CDerived() = default; CDerived(CDerived&&) = default; CDerived& operator=(CDerived&&) = default; virtual void DoStuff(); };
内容的提问来源于stack exchange,提问作者ATV
相关产品推荐
相关产品推荐

