c++类 | 同样成员变量初始化,为啥效率差这么多

github热门推荐 › c++类 | 同样成员变量初始化,为啥效率差这么多 (第 77 章)
文章工具

C++ 片段需补全 main() 函数才能运行在实训台打开 →
<span leaf=""><span class="code-snippet__comment">// ===========================================================</span></span></code><code><span leaf=""><span class="code-snippet__comment">// C++ 类成员变量 3 种初始化方式(含:执行时机 + 效率高低原因)</span></span></code><code><span leaf=""><span class="code-snippet__comment">// 最清晰版本 · 可直接复制</span></span></code><code><span leaf=""><span class="code-snippet__comment">// ===========================================================</span></span></code><code><span leaf=""><span class="code-snippet__meta">#</span><span class="code-snippet__meta"><span class="code-snippet__keyword">include</span></span><span class="code-snippet__meta"> </span><span class="code-snippet__meta"><span class="code-snippet__string"><iostream></span></span></span></code><code><span leaf=""><span class="code-snippet__meta">#</span><span class="code-snippet__meta"><span class="code-snippet__keyword">include</span></span><span class="code-snippet__meta"> </span><span class="code-snippet__meta"><span class="code-snippet__string"><string></span></span></span></code><code><span leaf=""><span class="code-snippet__keyword">using</span> <span class="code-snippet__keyword">namespace</span> std;</span></code><code><span leaf=""><span class="code-snippet__comment">// 无默认构造的测试类</span></span></code><code><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">NoDefault</span> {</span></code><code><span leaf=""><span class="code-snippet__keyword">public</span>:</span></code><code><span leaf="">    <span class="code-snippet__built_in">NoDefault</span>(<span class="code-snippet__type">int</span> x) { cout << <span class="code-snippet__string">"NoDefault 构造n"</span>; }</span></code><code><span leaf="">};</span></code><code><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">Demo</span> {</span></code><code><span leaf=""><span class="code-snippet__keyword">public</span>:</span></code><code><span leaf="">    <span class="code-snippet__comment">// ==================== 1. 类内就地初始化 ====================</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 执行时机:对象分配内存后、构造函数执行前</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 效率:高</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 原因:直接给成员赋初始值,无多余操作</span></span></code><code><span leaf="">    <span class="code-snippet__type">int</span> a = <span class="code-snippet__number">10</span>;</span></code><code><span leaf="">    string str = <span class="code-snippet__string">"类内默认"</span>;</span></code><code><span leaf="">    <span class="code-snippet__type">const</span> <span class="code-snippet__type">int</span> c = <span class="code-snippet__number">100</span>;</span></code><code><span leaf="">    <span class="code-snippet__type">int</span>& ref = a;</span></code><code><span leaf="">    NoDefault obj{<span class="code-snippet__number">99</span>};</span></code><code><span leaf="">    <span class="code-snippet__comment">// ==================== 2. 构造函数初始化列表(推荐 ✅) ====================</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 执行时机:类内初始化之后,函数体执行之前</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 效率:最高</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 效率高的原因:</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 1. 直接调用成员的构造函数,一步完成初始化</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 2. 不产生临时对象,不做“先构造、再赋值”</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 3. 自定义对象/string 等复杂类型性能明显更好</span></span></code><code><span leaf="">    <span class="code-snippet__built_in">Demo</span>()</span></code><code><span leaf="">        : <span class="code-snippet__built_in">a</span>(<span class="code-snippet__number">20</span>),</span></code><code><span leaf="">          <span class="code-snippet__built_in">str</span>(<span class="code-snippet__string">"列表初始化"</span>),</span></code><code><span leaf="">          <span class="code-snippet__built_in">obj</span>(<span class="code-snippet__number">123</span>)</span></code><code><span leaf="">    {</span></code><code><span leaf="">        <span class="code-snippet__comment">// 这里是第 3 阶段</span></span></code><code><span leaf="">    }</span></code><code><span leaf="">    <span class="code-snippet__comment">// ==================== 3. 构造函数体内赋值(不推荐 ❌) ====================</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 执行时机:最后执行(所有成员已经初始化完了)</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 效率:最低</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 效率低的原因:</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 1. 先执行成员的默认构造(浪费一次)</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 2. 再在函数体内执行赋值操作(第二次操作)</span></span></code><code><span leaf="">    <span class="code-snippet__comment">// 3. 复杂类型(string/自定义类)会产生临时对象 + 拷贝赋值,开销大</span></span></code><code><span leaf="">    <span class="code-snippet__built_in">Demo</span>(<span class="code-snippet__type">int</span> x) {</span></code><code><span leaf="">        a = <span class="code-snippet__number">30</span>;          <span class="code-snippet__comment">// 赋值(第二次操作)</span></span></code><code><span leaf="">        str = <span class="code-snippet__string">"体内赋值"</span>; <span class="code-snippet__comment">// 先默认构造 → 再赋值</span></span></code><code><span leaf="">    }</span></code><code><span leaf="">};</span></code><code><span leaf=""><span class="code-snippet__function"><span class="code-snippet__type">int</span></span><span class="code-snippet__function"> </span><span class="code-snippet__function"><span class="code-snippet__title">main</span></span><span class="code-snippet__function"><span class="code-snippet__params">()</span></span><span class="code-snippet__function"> </span>{</span></code><code><span leaf="">    Demo d1;</span></code><code><span leaf="">    <span class="code-snippet__function">Demo </span><span class="code-snippet__function"><span class="code-snippet__title">d2</span></span><span class="code-snippet__function"><span class="code-snippet__params">(</span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__number">5</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">)</span></span>;</span></code><code><span leaf="">    <span class="code-snippet__keyword">return</span> <span class="code-snippet__number">0</span>;</span></code><code><span leaf="">}</span>
🔥 终极清晰总结(执行时机 + 效率原因)
=========================================================================================方式                  执行时机                          效率      效率高/低的原因=========================================================================================1. 类内初始化         内存分配后 → 构造函数前            高        直接赋值,无多余操作2. 初始化列表         类内之后 → 函数体之前              最高      直接调用成员构造,一步到位,无临时对象3. 函数体内赋值       函数体内部(成员已初始化完)        最低      先默认构造 → 再赋值,两步操作,开销大=========================================================================================执行顺序(固定):类内初始化 → 初始化列表 → 函数体内赋值后面覆盖前面必须用初始化列表的:const、引用、无默认构造的对象


🎯 一句话背会

初始化列表效率最高,因为它直接一步初始化;体内赋值效率最低,因为它先构造、再赋值,走两步!


📊 真实性能差距(用数字你就懂了)

1. 基础类型(int /double/ 指针)

  • 初始化列表:1.0x(最快)
  • 类内初始化:1.0x(几乎一样)
  • 体内赋值:1.1x(慢 10%)

差距不大,但依然更慢。


2. 复杂类型(string /vector/ 自定义对象)【重点!】

  • 初始化列表:1.0x(最快)
  • 类内初始化:1.2x(慢 20%)
  • 体内赋值:2.5x ~ 5x(慢 150%~400%)

原因:体内赋值 = 先默认构造 + 再赋值 → 两次操作!初始化列表 = 直接构造 → 一次操作!

对象越复杂,性能差距越大!

⚠️ 版权声明

本文为免费文章,欢迎转载。转载请注明出处:一木科技(https://www.pingquan.vip/2026/05/31/c%e7%b1%bb-%e5%90%8c%e6%a0%b7%e6%88%90%e5%91%98%e5%8f%98%e9%87%8f%e5%88%9d%e5%a7%8b%e5%8c%96%ef%bc%8c%e4%b8%ba%e5%95%a5%e6%95%88%e7%8e%87%e5%b7%ae%e8%bf%99%e4%b9%88%e5%a4%9a/),并保留原文链接。