1. 程式人生 > >前++(--) 和 後++(--)的區別

前++(--) 和 後++(--)的區別

  程式設計的時候應該儘可能使用遞增操作符 ++ 和遞減操作符 -- 的字首形式.因為它少建立兩個臨時物件,效率比較高.
還是從程式碼來分析吧,比較有說服力:)

下面是 ++ 和 -- 的字首實現形式:
T& T::operator++(){                     T& T::operator--(){
    ++*this;                                --*this;
    return *this;                           return *this;
}                                       }

下面是 ++ 和 -- 的字尾實現形式:
T T::operator++(int){                   T T::operator--(int){
    T old(*this);                           T old(*this);
    ++*this;                                --*this;
    return old;                             return old;
}                                       }

我們來分析一下自增自減的字尾形式所多花費的開銷:
    T old(*this);
這一句產生一個型別為T的臨時物件 old, 並用原值*this進行初始化.當函式return的時候,又再次建立一個臨時物件,並用old的值進行初始,之後,區域性變數old被銷燬.並用臨時建立的變數對賦值符左邊的變數進行賦值(如果有的話).賦值後,臨時變數再次被銷燬.
    而字首形式的自增自減呢?首先函式內沒有建立臨時變數,故這方面的開銷就節省了.其次,返回的是一個引用,故也節省了這時候建立銷燬臨時物件的開銷.
    因此後綴式的自增自減,所多花費的開銷是兩次臨時變數的建立,以及兩次臨時變數的銷燬.如果自增自減的物件不是內建的資料型別,而一個類型別[當然,你首先得過載自增自減操作符:) ], 那麼這個開銷可能會比較大.因為變成了兩次建構函式以及兩次解構函式的呼叫.
    所以在呼叫程式碼的時候,要優先使用字首形式,除非確實需要字尾形式返回原值.

參考書籍: C++ 程式設計規範
    作者: Herb Sutter
          Andrei Alexandrescu 

相關推薦

++-- ++--區別

  程式設計的時候應該儘可能使用遞增操作符 ++ 和遞減操作符 -- 的字首形式.因為它少建立兩個臨時物件,效率比較高. 還是從程式碼來分析吧,比較有說服力:) 下面是 ++ 和 -- 的字首實現形式: T& T::operator++(){         

上傳圖片到七牛雲前端

在開發專案的時候,經常會用到上傳圖片的功能,如果把圖片全都存放在專案路徑下,會導致專案越來越臃腫,因此可以考慮把圖片上傳交給第三方處理,此處採用七牛雲進行圖片儲存。 經過測試,通過七牛雲獲取圖片確實比直接通過自己的伺服器獲取的速度要快得多,趕快去註冊七牛雲吧。

剪枝演算法剪枝演算法區別

(一)剪枝演算法的簡介: 剪枝一般是為了避免樹的過於複雜,過於擬合而進行的一個動作,剪枝操作是一個全域性的操作。 (二)預剪枝: 預剪枝就是在樹的構建過程(只用到訓練集),設定一個閾值,使得當在當前分裂節點中分裂前和分裂後的誤差超過這個閾值則分列,否則

多感測器融合技術基本概念、融合融合的區別

多感測器資訊融合(Multi-sensor Information Fusion,MSIF),就是利用計算機技術將來自多感測器或多源的資訊和資料,在一定的準則下加以自動分析和綜合,以完成所需要的

求n^k得三位三位Leading and Trailing

You are given two integers: n and k, your task is to find the most significant three digits, and least significant three digits of nk. In

SpringMVC的攔截器Interceptor過濾器Filter區別與聯系

get err 實例 分享 切面 簡介 () lee XML 一 簡介 (1)過濾器: 依賴於servlet容器。在實現上基於函數回調,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器實例只能在容器初始化時調用一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取

擴散diffusion彌散dispersion有什麽區別

C4D 三種 其中 zha question idt round sci flow 作者:謝易正鏈接:https://www.zhihu.com/question/23914350/answer/177359196來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商

C#中重寫override覆蓋new區別

實現 div del end 抽象方法 ring reg strong AR 重寫 用關鍵字 virtual 修飾的方法,叫虛方法。可以在子類中用override 聲明同名的方法,這叫“重寫”。相應的沒有用virtual修飾的方法,我們叫它實方法。重寫會改變父類方法的功能。

模塊句柄實例句柄句柄的區別

句柄看過windows核心編程的都知道有很多概念。同時如果你不只對windows有所了解,對linux mac等 *unix操作系統也有所了解的話。可能會出現有的東西都重合,而有的沒有。這裏說下win下句柄概念。網上解釋:解釋一:1.模塊的概念 一個模塊代表的是一個運行中的exe文件或dll文件,用來代表這

日常學習隨筆-用鏈表的形式實現普通二叉樹的新增、查找、遍歷、中、等基礎功能側重源碼+說明

新增 rabl super 例子 信息 count TP title 處理 一、二叉樹 1、二叉樹的概念 二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree),其次序不能任意顛倒。 2、性質

python zipzip*區別

IT int lis tle article 說明 bsp 解壓 壓縮 可以看成是解壓和壓縮的區別,zip相當與壓縮 zip(*)相當於解壓。 舉例說明: x=["a","1"] y=["b","2"] z = list(zip(x,y)) print (list(z

hashcodeequals的作用、區別、聯系

ces 引用 val 流程圖 依據 highlight key 基本類 util 介紹一、 hashCode()方法和equal()方法的作用其實一樣,在Java裏都是用來對比兩個對象是否相等一致,那麽equal()既然已經能實現對比的功能了,為什麽還要

Override重寫Overload重載區別

bsp 重寫 基礎 異常 子類 的區別 名稱 多態 load Override是發生在子類繼承父類的基礎上才會有的,子類重寫父類的方法,方法名,參數個數,和參數名稱,返回值都要是一樣的。重寫是覆蓋了父類的方法。子類 覆蓋父類方法時只能拋出父類的異常或者是異常的子類或者父類異

看完讓你徹底理解 WebSocket 原理,附完整的實戰代碼包含前端

tcp 協議 learn php 握手 live 雙向 簡單 再次 註意 1、前言 最近有同學問我有沒有做過在線咨詢功能。同時,公司也剛好讓我接手一個 IM 項目。所以今天抽時間記錄一下最近學習的內容。本文主要剖析了 WebSocket 的原理,以及附上一個完整的聊天室實戰

jQuery中的propattr區別

att 設置 參數 bsp 之前 () prop 使用 不同 1、jQuery中的prop()和attr()的區別   prop()是在jQuery1.6版本之後才有的,在之前一直都是使用attr(),   prop()修復了attr()的一些小bug。 2、推薦用法:  

Jquery動態添加標簽元素,在指定標簽或者標簽append/prepend用法

tcs 尾插 type code cdn doc click head span Jquery動態添加標簽元素,在指定標簽前或者標簽後(append/prepend用法) 1.append() 方法在被選元素的結尾插入指定內容。 2.appendTo() 方

python中np.multiply、np.dot星號*三種乘法運算的區別

圖片 分享 png blog details 分享圖片 blank net ref https://blog.csdn.net/zenghaitao0128/article/details/78715140 總結一下: python中np.multiply()、np.

【機器學習】簡單理解精確度precision準確率accuracy區別

    不少人對分類指標中的Precision和Accuracy區分不開,在其他部落格中也有很多相關介紹,但總體不夠簡明易懂。     筆者在查閱了若干資料後,總結如下:     Precis

將一個順序表實現奇數在,偶數在或負數在,偶數在

#include <stdio.h> /* 題目: 各元素為整數的順序表,各元素互不相同,設計演算法把所有奇數放到偶數的前邊 要求時間最少,輔助空間最少 演算法: 本質是順序表的逆置,只不過逆置有條件:前偶後奇才交換 */ #define maxlen 50 #define DAT

Verilog HDL 初級入門知識簡單講解wire reg 型別的區別, always assign 的區別,“阻塞”賦值 “非阻塞賦值”的區別

本文轉載自原作者:姚紀元,原文地址已失效        很多剛學Verilog HDL (硬體描述語言)的朋友肯定會對阻塞賦值和非阻塞賦值比較疑惑,那我們就一起來拋開這層迷霧吧。首先我們要理解兩種變數型別 Net Type(連線型)和