You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

显式默认析构函数是否会禁用移动语义影响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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:57:26