• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    Visual Studio 2010中C++的四大變化(3)

    發布: 2010-3-26 11:03 | 作者: 不詳 | 來源: 領測軟件測試網采編 | 查看: 17次 | 進入軟件測試論壇討論

    領測軟件測試網

      Visual Studio 2010中C++的四大變化(3) 軟件測試

      微軟即將在2010年4月12日發布Visual Studio 2010的正式版,對于C++語言做了修改,使之更加符合C++標準,文章將對C++語言的修改來做一下分析。

      右值引用

      作為最重要的一項語言特性,右值引用(rvalue references)被引入到 C++中。我們可以通過操作符“&&”來聲明一個右值引用,原先在C++中使用“&”操作符聲明的引用現在被稱為左值引用。

      int a; int& aa_lvref = a;// 左值引用 int b; int&& bb_rvref = b;// 右值應用

      左值引用和右值引用的表現行為基本一致,它們唯一的差別就是右值引用可以綁定到一個臨時對象(右值)上,而左值引用不可以。例如:

      int& a_lvref = int();// error C2440: 'initializing' : cannot convert from 'int' to 'int &' int&& b_rvref = int();// OK!

      在第一行代碼中,我們將一個臨時對象int()綁定到一個左值引用,將產生一個編譯錯誤。而在第二行中,我們將臨時對象綁定到右值引用,就可以順利通過編譯。右值是無名的數據,例如函數的返回值一般說來就是右值。當對右值進行操作的時候,右值本身往往沒有必要保留,因此在某些情況下可以直接“移動”之。通過右值引用,程序可以明確的區分出傳入的參數是否為右值,從而避免了不必要的拷貝,程序的效率也就得到了提高。我們考慮一個簡單的數據交換的小程序,從中來體會右值引用所帶來的效率提升。我們可以寫一個函數swap來實現兩個變量值的交換:

      template swap(T& a, T& b) { T tmp(a); // tmp對象創建后,我們就擁有了a的兩份拷貝 a = b;// 現在我們擁有b的兩份拷貝 b = tmp;// 現在我們擁有a的兩份拷貝 }

      在這段代碼中,雖然我們只是為了進行簡單的數據交換,但是卻執行了多次對象拷貝。這些對象的拷貝操作,特別是當這些對象比較大的時候,無疑會影響程序的效率。那么,如果使用右值引用如何實現呢?

      #include "stdafx.h" template T&& move(T&& a) { return a; } template void swap(T& a, T& b) { T tmp(move(a)); // 對象a被移動到對象tmp,a被清空 a = move(b);// 對象b被移動到對象a,b被清空 b = move(tmp);// 對象tmp被移動到對象b } int _tmain(int argc, _TCHAR* argv[]) { int a = 1; int b = 2; swap(a, b); return 0; } #include "stdafx.h" template T&& move(T&& a) { return a; } template void swap(T& a, T& b) { T tmp(move(a)); // 對象a被移動到對象tmp,a被清空 a = move(b);// 對象b被移動到對象a,b被清空 b = move(tmp);// 對象tmp被移動到對象b } int _tmain(int argc, _TCHAR* argv[]) { int a = 1; int b = 2; swap(a, b); return 0; }

      在這段重新實現的代碼中,我們使用了一個move()函數來代替對象的賦值操作符“=”,move()只是簡單地接受一個右值引用或者左值引用作為參數,然后直接返回相應對象的右值引用。這一過程不會產生拷貝(Copy)操作,而只會將源對象移動(Move)到目標對象。

      正是拷貝(Copy)和移動(Move)的差別,使得右值引用成為C++0x中最激動人心的新特性之一。從實踐角度講,它能夠完美是解決C++中長久以來為人所詬病的臨時對象的效率問題。從語言本身講,它健全了C++中的引用類型在左值右值方面的缺陷。從庫設計者的角度講,它給庫設計者又帶來了一把利器。而對于廣大的庫使用者而言,不動一兵一卒便能夠獲得“免費的”效率提升,在Visual Studio 2010中,因為有了對這些C++新特性的支持,重新點燃了程序員們對C++的熱情。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: studio Studio visual Visual


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>