• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    一種基于模板元編程的量綱檢測(cè)方法

    2009-03-02 09:33:12羅京麗杜建革
    現(xiàn)代電子技術(shù) 2009年4期
    關(guān)鍵詞:量綱

    羅京麗 杜建革

    摘 要:量綱誤用是科學(xué)計(jì)算應(yīng)用程序中一種常見(jiàn)的錯(cuò)誤,對(duì)計(jì)算結(jié)果的正確性影響很大。在此提出一種基于模板元編程的量綱檢測(cè)方法TADA,能夠有效完成C和C++程序代碼的量綱檢測(cè)工作。該方法利用程序設(shè)計(jì)語(yǔ)言自身的模板元編程功能,通過(guò)定義相關(guān)的量綱模板及其計(jì)算和標(biāo)注方法,依靠編譯器在編譯期間完成量綱分析和檢測(cè),無(wú)需任何運(yùn)行開(kāi)銷,有效解決了傳統(tǒng)量綱檢測(cè)系統(tǒng)中解方程組的計(jì)算量瓶頸等問(wèn)題。

    關(guān)鍵詞:模板元編程;TADA;量綱;計(jì)算量瓶頸

    中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:B 文章編號(hào):1004-373X(2009)04-080-06

    Dimensional Unit Analysis Method Based on Template Meta-programming

    LUO Jingli1,DU Jiange2

    (1.Jiangxi Light Industry College,Yichun,336000,China;2.Nanjing University of Technology,Nanjing,210094,China)

    Abstract:Misuse of measurement units is a common mistake in many scientific computing applications.It greatly influences the correctness of the application results.TADA,a tool that effectively detects errors of this kind for C/C++ programs is proposed.Making use of the function of template meta-programming in the language itself,TADA analyses the dimensional units and detects mismatches only by a standard C++ compiler in compile time without any runtime overhead.It avoids the computational bottleneck of solving linear equations introduced by traditional methods.

    Keywords:template meta-programming;TADA;measurement unit;computational bottleneck

    0 引 言

    量綱誤用在科學(xué)計(jì)算程序中是一種常見(jiàn)的錯(cuò)誤,然而程序設(shè)計(jì)語(yǔ)言的標(biāo)準(zhǔn)類型系統(tǒng)卻對(duì)此無(wú)

    能為力。物理方程中的量綱錯(cuò)誤可以手工分析出來(lái),然而求解物理方程的計(jì)算機(jī)程序中的量綱錯(cuò)誤卻難以被發(fā)現(xiàn),因?yàn)橛?jì)算程序往往很復(fù)雜。例如,一些研究者認(rèn)為火星氣候探測(cè)衛(wèi)星的丟失,是因?yàn)槌绦蛑邪岩粋€(gè)英制單位的變量傳遞給了使用公制單位的模塊[1]。因而,量綱的正確性對(duì)計(jì)算結(jié)果的正確性非常重要。

    近年來(lái),研究者們提出了一些量綱檢測(cè)方法[2-5],典型的如Osprey量綱檢測(cè)方法[2]。Osprey方法包含5個(gè)主要步驟:

    (1) 對(duì)待檢測(cè)源程序進(jìn)行單位標(biāo)注,使得檢測(cè)器能夠知道每個(gè)變量的單位;

    (2) C語(yǔ)言解析和語(yǔ)法檢查;

    (3) 生成包含單位信息的抽象語(yǔ)法樹(shù);

    (4) 生成約束(方程);

    (5) 方程的化簡(jiǎn)及高斯消去求解(GE)。

    可以看出,Osprey方法步驟較多,每步都需要語(yǔ)言外的其他工具,并需要對(duì)其進(jìn)行修改、擴(kuò)充,而且最后的高斯消去(GE)計(jì)算量非常大,是Osprey方法的性能瓶頸。使用Osprey方法還有一個(gè)問(wèn)題,就是需要同時(shí)維護(hù)2份源代碼:一份正常代碼用于編譯測(cè)試;另一份包含量綱信息的檢測(cè)代碼,修改正常代碼后必須及時(shí)對(duì)檢測(cè)代碼進(jìn)行更新,維護(hù)起來(lái)也比較繁瑣。此外,由于C++語(yǔ)言的解析非常困難,Osprey方法目前沒(méi)有實(shí)現(xiàn)對(duì)C++程序的量綱檢測(cè)。

    針對(duì)這些問(wèn)題,提出一種基于模板元編程的量綱檢測(cè)方法TADA(TMP-bAsed Dimensional Analysis Method),其基本思路是利用程序設(shè)計(jì)語(yǔ)言自身的模板元編程(Template Meta Programming,TMP)功能,讓編譯器在編譯時(shí)對(duì)程序中的量綱進(jìn)行準(zhǔn)確性檢測(cè),從而可以避免Osprey方法的計(jì)算量大等諸多問(wèn)題。TADA方法具有下列優(yōu)點(diǎn):

    (1) TADA方法可使得應(yīng)用開(kāi)發(fā)人員不需要維護(hù)2份代碼,因?yàn)槭褂肨ADA方法的檢測(cè)程序也完全是一個(gè)合法的可編譯的程序。

    (2) TADA方法的量綱檢測(cè)完全在編譯期間進(jìn)行,對(duì)程序不會(huì)引入任何運(yùn)行時(shí)開(kāi)銷。

    (3) TADA方法無(wú)需進(jìn)行方程組求解工作,可以適用于任何規(guī)模的程序。與Osprey等方法類似,TADA方法也需要手工對(duì)程序添加量綱信息,其標(biāo)注的工作量與Osprey等方法相當(dāng)。但TADA方法中編譯器在進(jìn)行檢測(cè)的時(shí)候無(wú)需進(jìn)行Osprey方法中的方程組求解工作,因而不再有Osprey方法的計(jì)算瓶頸。

    (4) TADA方法采用模塊化設(shè)計(jì),使得單位的表示與匹配檢測(cè)之間實(shí)現(xiàn)了松耦合,支持用戶可以以一致的方式增加新的單位。

    1 模板元編程(TMP)技術(shù)

    在C++程序設(shè)計(jì)語(yǔ)言中,模板元編程[6-8]是實(shí)現(xiàn)代碼重用的一種重要機(jī)制。下面首先對(duì)模板元編程技術(shù)進(jìn)行介紹,然后給出TADA方法中需要使用的幾個(gè)基本的模板元程序。

    1.1 模板元編程簡(jiǎn)介

    模板可以將類型定義為參數(shù),以提高代碼的可重用性。模板包括類模板和函數(shù)模板等。函數(shù)模板與模板函數(shù)的區(qū)別可以類比于類與對(duì)象的區(qū)別:函數(shù)模板是模板的定義;而模板函數(shù)是函數(shù)模板的實(shí)例,具有程序代碼,占用內(nèi)存空間。當(dāng)編譯系統(tǒng)發(fā)現(xiàn)了函數(shù)模板一個(gè)對(duì)應(yīng)的函數(shù)調(diào)用后,根據(jù)實(shí)參的類型來(lái)確認(rèn)是否匹配函數(shù)模板中對(duì)應(yīng)的形參,然后生成一個(gè)重載函數(shù),稱該重載函數(shù)為模板函數(shù)。類似地,在聲明了一個(gè)類模板后,也可以創(chuàng)建類模板的實(shí)例—模板類。

    類模板的一般形式如下:

    template

    class 類名{

    //類定義…

    };

    C++的模板系統(tǒng)能夠通過(guò)模板的特化、偏特化實(shí)現(xiàn)邏輯判斷,并能通過(guò)模板遞歸實(shí)現(xiàn)循環(huán),構(gòu)成了一個(gè)圖靈完全的二級(jí)語(yǔ)言[6]。使用這種二級(jí)語(yǔ)言進(jìn)行編程叫作C++模板元編程(Template Meta Programming,TMP)。模板元編程的驅(qū)動(dòng)力是模板的遞歸實(shí)例化。下面給出C++模板元編程的一個(gè)示例。

    首先定義一個(gè)類模板,通過(guò)該類模板可實(shí)現(xiàn)在編譯期間計(jì)算4的任意次方。如下所示:

    pow4.hpp

    #ifndef POW4_HPP

    #define POW4_HPP

    //primary template to compute;

    template

    class Pow4 {

    public:

    enum { result = 4 * Pow4::result };

    };

    //full specialization to end the recursion

    template<>

    class Pow4<0> {

    public:

    enum { result = 1 };

    };

    通過(guò)下面的程序來(lái)使用該模板。

    Test.cpp

    #endif // POW4_HPP

    #include

    #include "pow4.hpp"

    int main()

    {

    std::cout << "Pow4<7>::result = "

    << Pow4<7>::result << '\n';

    }

    程序Test.cpp執(zhí)行完后,會(huì)正確輸出4的7次方的值,該數(shù)值是C++編譯器在編譯模板元程序時(shí)遞歸計(jì)算得到。由于模板元程序完全在編譯期間執(zhí)行,相當(dāng)于對(duì)編譯器功能進(jìn)行擴(kuò)充,因而利用這種程序進(jìn)行量綱檢測(cè)具有良好的可行性。

    1.2 基本模板元程序

    下面給出TADA方法中需要使用的幾個(gè)基本的模板元程序。

    (1) 靜態(tài)判斷

    template

    struct StaticIF

    {

    typedef T2 ResultType;

    };

    template

    struct StaticIF

    {

    typedef T1 ResultType;

    };

    語(yǔ)法:StaticIF::ResultType

    語(yǔ)義:當(dāng)cond為真時(shí),ResultType為T1,否則ResultType為T2。

    (2) 靜態(tài)斷言

    template void StaticAssert(){return UnitError;};

    template<> void StaticAssert(){};

    語(yǔ)法:StaticAssert();

    語(yǔ)義:當(dāng)cond為真時(shí)什么也不做,否則產(chǎn)生一個(gè)編譯期錯(cuò)誤(UnitError沒(méi)有定義,或void函數(shù)不應(yīng)該有返回值)。

    (3) 靜態(tài)絕對(duì)值

    template

    struct StaticABS

    {

    static const int value = n>=0 ? n :-n;

    };

    語(yǔ)法:StaticABS::value

    語(yǔ)義:n的絕對(duì)值,其中n為int類型。

    (4) 靜態(tài)最大公約數(shù)

    template

    struct StaticGCD

    { //b!=0

    static const int result = StaticIF<(a,StaticGCD >::ResultType::result;

    };

    template

    struct StaticGCD

    {

    static const int result=a;

    };

    語(yǔ)法:StaticGCD::result

    語(yǔ)義:遞歸的使用輾轉(zhuǎn)相除法在編譯期間求出a與b的最大公約數(shù),其中a與b為int類型。

    2 TADA量綱檢測(cè)方法

    TADA量綱檢測(cè)方法需要涉及到單位和量綱的表示、計(jì)算、標(biāo)注以及數(shù)學(xué)運(yùn)算函數(shù)的量綱包裝等各個(gè)組成步驟,下面將依次對(duì)其進(jìn)行介紹。

    2.1 單位和量綱的表示

    在Osprey方法中,量綱是用一個(gè)長(zhǎng)度為7的向量表示的,每個(gè)分量對(duì)應(yīng)一個(gè)SI標(biāo)準(zhǔn)量綱。TADA方法中也采用了這種方式。為了簡(jiǎn)化闡述,本文只討論長(zhǎng)度、重量、時(shí)間這三種量綱,其SI單位分別為米、千克和秒(TADA方法可直接推廣到其他各種量綱)。由于TMP程序的特殊性,它并沒(méi)有數(shù)組或向量的支持,也不能使用浮點(diǎn)數(shù)據(jù)(使用浮點(diǎn)數(shù)表示量綱也會(huì)帶來(lái)不精確性),量綱在TMP程序中的表示形式有所不同:用u11,u12,u21,u22,u31,u32之類的整型量分別表示米u(yù)11u12,千克u11u12,秒u11u12,并輔以ratio表示同量綱、不同單位之間的比值,如分鐘和秒的比值為60。

    TADA方法可靜態(tài)地建立如下常用單位:

    Struct UnitRoot//無(wú)量綱

    {

    static const int u11 = 0;

    static const int u12 = 1;

    static const int u21 = 0;

    static const int u22 = 1;

    static const int u31 = 0;

    static const int u32 = 1;

    static const double ratio;

    };

    const double UnitRoot::ratio=1;

    struct ULength: UnitRoot {}; //長(zhǎng)度量綱

    struct UWeight: UnitRoot {}; //重量量綱

    struct UTime:UnitRoot {}; //時(shí)間量綱

    struct UAngle:UnitRoot {}; //角的大小(無(wú)量綱)

    struct UnitLess :UnitRoot {}; //無(wú)量綱

    struct UMeter:ULength{static const int u11=1;}; //米

    struct UKG:UWeight{static const int u21=1;}; //千克

    struct USecond:UTime{static const int u31=1;}; //秒

    struct UAcceleration:UnitRoot {static const int u11=1;//加速度:米/秒^2

    static const int u31=-2;};

    struct URadian: UAngle{}; //角度

    struct UAngleDegree:UAngle{static const double ratio;}; //弧度

    const double UAngleDegree::ratio=180/3.141592653589793;

    //弧度與角度的比例

    模板元程序在計(jì)算公式的時(shí)候需要推導(dǎo)出新的量綱,例如在計(jì)算“e=12mv2”的時(shí)候,編譯器應(yīng)該能根據(jù)等號(hào)右邊的公式計(jì)算出它的量綱,并與e的量綱進(jìn)行比較判別。TADA方法的量綱是用分?jǐn)?shù)形式表示的,在每次量綱計(jì)算之后都需要進(jìn)行分?jǐn)?shù)的約分處理,才能進(jìn)行相等性判斷,因而TADA方法可用如下的方式處理新生成單位,如下所示。

    template

    struct BuildUnit :public UnitRoot

    {

    static const int gcd1 = StaticGCD::result;

    static const int gcd2 = StaticGCD::result;

    static const int gcd3 = StaticGCD::result;

    static const int u11 = U11/gcd1;

    static const int u12 = U12/gcd1;

    static const int u21 = U21/gcd2;

    static const int u22 = U22/gcd2;

    static const int u31 = U31/gcd3;

    static const int u32 = U32/gcd3;

    };

    2.2 單位和量綱的計(jì)算

    由于量綱都是用分?jǐn)?shù)表示的,因而其計(jì)算會(huì)稍有麻煩。下面定義TADA方法中量綱分?jǐn)?shù)的加、減、乘、除和等價(jià)測(cè)試運(yùn)算。

    (1) 分?jǐn)?shù)的加法運(yùn)算,如下所示。

    template

    struct FractionAdd

    {

    static const int U1=u11*u22+u21*u12;

    static const int U2=u12*u22;

    };

    語(yǔ)法:FractionAdd ::U1、FractionAdd::U2

    語(yǔ)義:分?jǐn)?shù)相加并約分,即:

    U1U2=u11*u22+u21*u12u12*u22,且GCD(U1,U2)=1。

    (2) 分?jǐn)?shù)的減法運(yùn)算。

    TADA方法通過(guò)加法實(shí)現(xiàn)減法計(jì)算,如下所示。

    template

    struct FractionSub

    {

    static const int U1=FractionAdd::U1;

    static const int U2=FractionAdd::U2;

    };

    語(yǔ)法:FractionSub::U1、FractionSub::U2

    語(yǔ)義:分?jǐn)?shù)相減并約分,即:

    U1U2=u11*u22-u21*u12u12*u22,且GCD(U1,U2)=1。

    (3) 單位相乘。

    分別將3個(gè)量綱分?jǐn)?shù)相加,然后使用BuildUnit生成新單位。

    template

    struct UnitMultiply

    {

    typedef FractionAdd

    b::u12> FM1;

    typedef FractionAdd

    b::u22> FM2;

    typedef FractionAdd

    b::u32> FM3;

    typedef BuildUnit<

    FM1::U1,FM1::U2,

    FM2::U1,FM2::U2,

    FM3::U1,FM3::U2> ResultType;

    };

    語(yǔ)法:UnitMultiply::ResultType

    語(yǔ)義:?jiǎn)挝籙a與單位Ub相乘后的新單位。

    (4) 單位相除。

    與乘法處理方式相似。

    template

    struct UnitDivide

    {

    typedef FractionSub

    b::u12> FM1;

    typedef FractionSub

    b::u22> FM2;

    typedef FractionSub

    b::u32> FM3;

    typedef BuildUnit<

    FM1::U1,FM1::U2,

    FM2::U1,FM2::U2,

    FM3::U1,FM3::U2> ResultType;

    };

    語(yǔ)法:UnitDivide ::ResultType

    語(yǔ)義:?jiǎn)挝籙a除以單位Ub后的新單位。

    (5) 單位的等價(jià)測(cè)試函數(shù)(宏)

    #define UNIT_CHECK(a,b) StaticAssert<

    (a::u11==b::u11) && (a::u12==b::u12) &&

    (a::u21==b::u21) &&

    (a::u22==b::u22) &&

    (a::u31==b::u31) && (a::u32==b::u32)>()

    語(yǔ)法:UNIT_CHECK(Ua,Ub);

    語(yǔ)義:若單位Ua與單位Ub等價(jià)則不產(chǎn)生任何效果,否則產(chǎn)生編譯期錯(cuò)誤。

    2.3 單位和量綱標(biāo)注的原理和語(yǔ)法

    與Osprey等方法類似,TADA方法也在待檢測(cè)源程序進(jìn)行單位標(biāo)注,以使得檢測(cè)器能夠知道每個(gè)變量的單位。由于經(jīng)過(guò)單位標(biāo)注的待檢測(cè)程序仍然是合法的可編譯的程序,所以標(biāo)注信息必須由語(yǔ)言自身已有的語(yǔ)法要素構(gòu)成;標(biāo)注信息還不能影響被標(biāo)注變量的任何計(jì)算特性及使用方式,只有滿足這兩點(diǎn)要求的標(biāo)注方式才能使標(biāo)注工作量最小化。此外,已標(biāo)注變量應(yīng)該禁止從未標(biāo)注變量進(jìn)行各種隱含的類型轉(zhuǎn)換,這樣嚴(yán)格的限制才能有效進(jìn)行單位量綱的匹配檢測(cè)。對(duì)于C++語(yǔ)言來(lái)說(shuō),可以采用模板類的方式實(shí)現(xiàn)。

    標(biāo)注實(shí)質(zhì)上是把語(yǔ)言原始的數(shù)據(jù)類型替換成TADA方法預(yù)定義的模板類,而模板類實(shí)現(xiàn)了各種運(yùn)算符號(hào)的重載,同時(shí)禁止了任何隱含的類型轉(zhuǎn)換,使得量綱標(biāo)注既滿足語(yǔ)法要素的要求,又滿足計(jì)算兼容性的要求和禁止隱含轉(zhuǎn)換的要求。TADA方法中標(biāo)注的實(shí)現(xiàn)如下所示。

    template

    //T為基礎(chǔ)變量類型(int、double...)

    struct UnitBase//U為單位量綱信息

    {

    typedef UnitBase ThisType;//自身類型

    T value; //實(shí)際的數(shù)值

    UnitBase(){}

    explicit //禁止從基礎(chǔ)類型進(jìn)行隱含構(gòu)造轉(zhuǎn)換

    UnitBase(T init_value):value(init_value){}

    operator T (){return value;}

    //允許向基礎(chǔ)類型隱含轉(zhuǎn)換

    //以下定義各種運(yùn)算符,使得標(biāo)注類可以模擬原始變量進(jìn)行各種運(yùn)算

    #define TEMPLATE template

    TEMPLATE UnitBase(const UnitBase& rhs)

    {

    UNIT_CHECK(U,U2);//單位等價(jià)性檢測(cè)

    value=rhs.value;

    }

    TEMPLATE ThisType& operator = (UnitBase rhs)

    {

    UNIT_CHECK(U,U2);

    value=rhs.value;

    return *this;

    }

    TEMPLATE bool operator == (UnitBase rhs)

    {

    UNIT_CHECK(U,U2);

    return value==rhs.value;

    }

    TEMPLATE ThisType& operator += (UnitBase rhs)

    {

    UNIT_CHECK(U,U2);

    value+=rhs.value;

    return *this

    }

    TEMPLATE ThisType& operator -= (UnitBase rhs)

    {

    UNIT_CHECK(U,U2);

    value-=rhs.value;

    return *this

    }

    TEMPLATE ThisType operator + (UnitBase rhs)

    {

    UNIT_CHECK(U,U2);

    return ThisType(value+rhs.value);

    }

    TEMPLATE ThisType operator - (UnitBase rhs)

    {

    UNIT_CHECK(U,U2);

    return ThisType(value-rhs.value);

    }

    TEMPLATE UnitBase::ResultType>

    operator * (UnitBase rhs)

    {

    typedef UnitMultiply::ResultType TT;

    return UnitBase(value*rhs.value);

    }

    TEMPLATE ThisType& operator *= (UnitBase rhs)

    {

    UNIT_CHECK(U2,UnitRoot);

    value*=rhs.value;

    return *this;

    }

    TEMPLATE UnitBase::ResultType>

    operator / (UnitBase rhs)

    {

    typedef UnitDivide::ResultType TT;

    return UnitBase(value/rhs.value);

    }

    #undef TEMPLATE

    //以下定義可以顯式禁止其他一切引起隱含類型轉(zhuǎn)換的運(yùn)算

    template ThisType operator + (T2 rhs){return UnitError;}

    template ThisType operator - (T2 rhs){return UnitError;}

    template ThisType operator * (T2 rhs){return UnitError;}

    template ThisType operator / (T2 rhs){return UnitError;}

    template ThisType& operator += (T2 rhs){return UnitError;}

    template ThisType& operator -= (T2 rhs){return UnitError;}

    template ThisType& operator *=

    (T2 rhs){return UnitError;}

    template ThisType& operator /= (T2 rhs){return UnitError;}

    };

    2.4 定義單位量綱

    量綱檢測(cè)系統(tǒng)應(yīng)該預(yù)定義常用單位量綱,以方便應(yīng)用開(kāi)發(fā)人員使用。TADA方法采用如下方式定義單位量綱:

    {//米

    typedef UnitBase Double;

    typedef UnitBase Float;

    typedef UnitBaseInt;

    typedef UnitBaseLong;

    }

    namespace KG //千克

    {

    typedef UnitBaseDouble;

    typedef UnitBaseFloat;

    typedef UnitBase Int;

    typedef UnitBaseLong;

    }

    namespace Second//秒

    {

    typedef UnitBase Double;

    typedef UnitBase Float;

    typedef UnitBaseInt;

    typedef UnitBase Long;

    }

    namespace Acceleration //加速度:米/秒^2

    {

    typedef UnitBase Double;

    typedef UnitBaseFloat;

    typedef UnitBaseInt;

    typedef UnitBaseLong;

    }

    namespace Radian//弧度

    {

    typedef UnitBase Double;

    typedef UnitBase Float;

    typedef UnitBaseInt;

    typedef UnitBase Long;

    }

    namespace AngleDegree //角度

    {

    typedef UnitBase Double;

    typedef UnitBase Float;

    typedef UnitBase Int;

    typedef UnitBase Long;

    }

    ……

    2.5 數(shù)學(xué)運(yùn)算函數(shù)的量綱包裝

    對(duì)于指數(shù)、對(duì)數(shù)、三角函數(shù)等已有的數(shù)學(xué)運(yùn)算函數(shù),其參數(shù)與返回值都是沒(méi)有單位量綱的,不能直接用于有量綱的公式計(jì)算。針對(duì)這個(gè)問(wèn)題,TADA方法提供了這些函數(shù)的量綱包裝,以sqrt和sin為例如下:

    #define HALF_UNIT(U) BuildUnit

    template

    UnitBase Sqrt(UnitBase

    U> n)

    {//開(kāi)方函數(shù)應(yīng)使單位的所有量綱減半

    return UnitBase(::sqrt(n.value));

    }

    #undef HALF_UNIT

    template

    UnitBase Sin(UnitBase n)

    {//正弦函數(shù)的參數(shù)應(yīng)為弧度,返回值為無(wú)量綱

    UNIT_CHECK(U,URadian);

    return UnitBase(::sin(n.value));

    }

    2.6 輔助工具

    TADA方法還提供了一些輔助工具,用于將量綱變量以適合閱讀的方式顯示出來(lái),例如:

    Unit::Second::Double n(10);

    Unit::Meter::Double m(20);

    cout<

    可以得到這樣的輸出結(jié)果:

    0.2米/秒^2

    2.7 分析和評(píng)估

    在TADA方法的基礎(chǔ)上,實(shí)現(xiàn)了面向C/C++程序的量綱檢測(cè)系統(tǒng)(TADA系統(tǒng)),并對(duì)TADA系統(tǒng)的檢測(cè)能力進(jìn)行了分析和評(píng)估。

    首先采用TADA系統(tǒng)來(lái)檢測(cè)下面的樣例程序。

    unit.cpp

    #include "unit.h"

    using namespace std;

    int main(int argc,char* argv[])

    {

    Unit::Second::Double n(10);

    Unit::Meter::Double m(20);

    Unit::KG::Double c; //示量綱不匹配

    c=m/n/n;

    return 0;

    }

    在TADA系統(tǒng)中,Visual Studio 2003編譯該程序會(huì)出現(xiàn)類似如下的錯(cuò)誤信息,錯(cuò)誤信息的第3行就表明了unit.cpp的第9行有錯(cuò)誤。

    meta_prog_basic.h(15) :error C2065:"UnitError":未聲明的標(biāo)識(shí)符

    d:\My Documents\Visual Studio Projects\unit\unit_core.h(70) :參見(jiàn)…的引用

    d:\My Documents\Visual Studio Projects\unit\unit.cpp(9) :參見(jiàn)…的引用

    在檢測(cè)能力方面,采用文獻(xiàn)[2]的樣例程序?qū)ADA系統(tǒng)和Osprey系統(tǒng)的量綱檢測(cè)能力進(jìn)行了對(duì)比評(píng)估。在文獻(xiàn)[2]中,Osprey共找到了3個(gè)錯(cuò)誤,其中前2個(gè)是單位誤用錯(cuò)誤,第3個(gè)是單位轉(zhuǎn)換比例因子錯(cuò)誤。TADA系統(tǒng)也完全找到了前2個(gè)錯(cuò)誤,而第3個(gè)錯(cuò)誤在標(biāo)注時(shí)被避免掉了,因?yàn)樵搯挝幌到y(tǒng)包含了量綱之間的比例因子,能夠進(jìn)行自動(dòng)的單位轉(zhuǎn)換。

    在性能和可擴(kuò)展性方面,TADA系統(tǒng)能夠更有效地實(shí)現(xiàn)對(duì)C/C++程序的量綱檢測(cè)。Osprey系統(tǒng)引入了具有較高計(jì)算復(fù)雜度的線性方程組求解步驟,需要很大的計(jì)算和時(shí)間開(kāi)銷來(lái)解線性解方程組。TADA系統(tǒng)基于模板元編程技術(shù),只需要利用語(yǔ)言自身的語(yǔ)法能力,靠編譯器進(jìn)行單位量綱檢查,沒(méi)有帶來(lái)太多額外的復(fù)雜計(jì)算。并且TADA系統(tǒng)不會(huì)帶來(lái)任何程序的運(yùn)行時(shí)開(kāi)銷。因此TADA系統(tǒng)可適用于各種規(guī)模的C/C++程序,具有更好的性能和可擴(kuò)展性。

    在易用性方面,TADA系統(tǒng)的標(biāo)注負(fù)擔(dān)與Osprey系統(tǒng)相當(dāng)。由于TADA系統(tǒng)利用C++編譯器的功能進(jìn)行錯(cuò)誤檢測(cè),而C++編譯器遇到模板錯(cuò)誤時(shí)的錯(cuò)誤信息卻不很直觀,錯(cuò)誤報(bào)告的可讀性較弱,但仍可以快速定位到錯(cuò)誤點(diǎn)。

    3 結(jié) 語(yǔ)

    這里提出一種新穎的基于模板元編程的單位量綱檢測(cè)方法TADA,并基于該方法實(shí)現(xiàn)了一個(gè)單位量綱檢測(cè)系統(tǒng)。

    TADA方法采用模板元編程技術(shù),使得經(jīng)過(guò)單位量綱標(biāo)注的受測(cè)程序仍然是一個(gè)完整、合法、可編譯的C/C++程序,無(wú)需維護(hù)多套程序代碼,也無(wú)需進(jìn)行復(fù)雜的解方程組運(yùn)算,就能夠在程序代碼中發(fā)現(xiàn)量綱錯(cuò)誤,具有良好的實(shí)用性和可擴(kuò)展性,可以有效適用于多種規(guī)模程序的量綱檢測(cè)。

    參 考 文 獻(xiàn)

    [1]Mars Climate Orbiter Mishap Investigation.ftp://ftp.hq.nasa.gov/pub/pao/reports/1999/MCO_report.pdf.

    [2]Jiang Lingxiao,Su Zhendong.Osprey:A Practical Type System for Validating Dimensional Unit Correctness of C Programs.Proc.of ICSE′06.Shanghai,2006.

    [3]Allen E E,Hase D,V.Luchangco,et al.Object-oriented Units of Measurement.Proc.of OOPSLA′04.Canada,2004:384-403.

    [4]Brown W E.Applied Template Meta-programming in SIUNITS:The Library of Unit-based Computation.http://www.oonumerics.org/tmpwol/brown.pdf,2001.

    [5]Foster J S,Ahndrich M F,Aiken A.A Theory of Type Qualifiers.Proc.of PLDI′99.Ottawa,1999,34(5):192-203.

    [6]Todd L Veldhuizen.C++ Templates are Turing-complete.http://osl.iu.edu/~tveldhui/papers/2003/turing.pdf.

    [7]Micolai Josuttis,David Vandevoorde.C++ Templates:The Complete Guide.Pearson Education,2003.

    [8]The Boost:MPL Library.http://www.boost.org.

    [9]Anderson E,Bai Z,Bischof C,et al.LAPACK Users′ Guide.Third Edition.Society for Industrial and Applied Mathematics,1999.

    [10]Das M,Lerner S,Seigle M.ESP:Path-sensitive Program Verification in Polynomial Time.Proc.of PLDI′02.Ottawa,2002:57-68.

    [11]Antoniu T,Steckler R A,Krishnamurthi S,et al.Validating the UnitCorrectness of Spread Sheet Programs.Proc.of ICSE′04.Edinburg,2004:439-448.

    作者簡(jiǎn)介 羅京麗 女,1977年出生,江西安福人,江西省輕工高級(jí)技校講師,學(xué)士。主要研究方向?yàn)橛?jì)算機(jī)軟件和計(jì)算機(jī)應(yīng)用。

    杜建革 男,1973年出生,重慶人,南京理工大學(xué)碩士。主要研究領(lǐng)域?yàn)橛?jì)算機(jī)軟件和計(jì)算機(jī)應(yīng)用。

    注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文。

    猜你喜歡
    量綱
    量綱分析在熱力學(xué)統(tǒng)計(jì)物理中的教學(xué)應(yīng)用*
    關(guān)于電學(xué)基礎(chǔ)課程物理量的量綱與單位的討論
    “量綱”在小學(xué)數(shù)學(xué)深度教學(xué)中的應(yīng)用
    淺談量綱法推導(dǎo)物理公式的優(yōu)勢(shì)
    ——以勻加速直線運(yùn)動(dòng)公式為例
    中學(xué)物理思維的培養(yǎng)在大學(xué)物理教學(xué)中的重要性
    科技論文編輯加工中的量綱問(wèn)題
    量綱淺析
    基于量綱分析的測(cè)試計(jì)量?jī)x器創(chuàng)新設(shè)計(jì)
    化學(xué)平衡常數(shù)真的只與溫度有關(guān)么
    量綱分析及其應(yīng)用
    物理與工程(2012年6期)2012-07-05 05:31:48
    精品人妻在线不人妻| 亚洲欧美一区二区三区久久| 久久久久久久久免费视频了| www.熟女人妻精品国产| 久久久久国产一级毛片高清牌| 18禁裸乳无遮挡动漫免费视频| 亚洲国产欧美在线一区| 婷婷丁香在线五月| 99热国产这里只有精品6| 久久九九热精品免费| tocl精华| 嫁个100分男人电影在线观看| 国产色视频综合| 欧美成狂野欧美在线观看| 国产精品成人在线| 欧美乱妇无乱码| 91精品三级在线观看| 免费在线观看完整版高清| 十八禁网站免费在线| 19禁男女啪啪无遮挡网站| 大香蕉久久网| 国产一区二区激情短视频| 老司机影院毛片| 男女之事视频高清在线观看| 国产av精品麻豆| 51午夜福利影视在线观看| av网站免费在线观看视频| 国产黄色免费在线视频| 久久精品亚洲av国产电影网| 一区在线观看完整版| 日本一区二区免费在线视频| aaaaa片日本免费| 中文字幕色久视频| 法律面前人人平等表现在哪些方面| 国产亚洲欧美精品永久| 黑人猛操日本美女一级片| 制服人妻中文乱码| 人人妻人人添人人爽欧美一区卜| 一级毛片精品| 久久精品国产综合久久久| 在线十欧美十亚洲十日本专区| 国产精品99久久99久久久不卡| 一二三四在线观看免费中文在| 国产一区二区三区视频了| 丝瓜视频免费看黄片| 搡老岳熟女国产| 欧美变态另类bdsm刘玥| 欧美黑人欧美精品刺激| 中文字幕人妻丝袜一区二区| 国产在线免费精品| 黄色视频,在线免费观看| 狠狠婷婷综合久久久久久88av| 欧美在线一区亚洲| 欧美日韩成人在线一区二区| 最黄视频免费看| 老司机午夜十八禁免费视频| 中文字幕色久视频| 中文字幕色久视频| 国产一区二区激情短视频| avwww免费| 亚洲视频免费观看视频| 欧美精品人与动牲交sv欧美| 色婷婷av一区二区三区视频| 欧美另类亚洲清纯唯美| 久久久久久亚洲精品国产蜜桃av| 欧美成人免费av一区二区三区 | 国产av一区二区精品久久| 蜜桃在线观看..| 国产在线免费精品| 丝袜美腿诱惑在线| 亚洲国产欧美一区二区综合| 如日韩欧美国产精品一区二区三区| bbb黄色大片| 一本—道久久a久久精品蜜桃钙片| 国产精品欧美亚洲77777| 怎么达到女性高潮| 丰满少妇做爰视频| 麻豆成人av在线观看| 中文字幕制服av| 国产xxxxx性猛交| a级片在线免费高清观看视频| videosex国产| 欧美在线一区亚洲| 成年人黄色毛片网站| 亚洲伊人久久精品综合| 老司机福利观看| 国产日韩一区二区三区精品不卡| 少妇猛男粗大的猛烈进出视频| 老司机亚洲免费影院| 一边摸一边抽搐一进一出视频| 蜜桃国产av成人99| 国产亚洲精品第一综合不卡| 日韩欧美一区二区三区在线观看 | 国产一区有黄有色的免费视频| 他把我摸到了高潮在线观看 | 免费一级毛片在线播放高清视频 | 巨乳人妻的诱惑在线观看| 亚洲第一青青草原| 91成年电影在线观看| 国产成人精品久久二区二区91| 香蕉国产在线看| 女人精品久久久久毛片| 制服人妻中文乱码| 欧美乱码精品一区二区三区| 曰老女人黄片| 久久婷婷成人综合色麻豆| 国产精品久久久av美女十八| 黄片小视频在线播放| 90打野战视频偷拍视频| 国产伦人伦偷精品视频| 汤姆久久久久久久影院中文字幕| av福利片在线| 成人三级做爰电影| 青青草视频在线视频观看| 一区二区三区乱码不卡18| 亚洲欧美激情在线| 亚洲少妇的诱惑av| 免费在线观看完整版高清| 国产有黄有色有爽视频| 大香蕉久久成人网| 亚洲人成伊人成综合网2020| 丰满人妻熟妇乱又伦精品不卡| 亚洲中文日韩欧美视频| 老司机在亚洲福利影院| 18禁观看日本| 一区福利在线观看| 视频区欧美日本亚洲| 色精品久久人妻99蜜桃| 国产欧美日韩综合在线一区二区| 亚洲国产欧美在线一区| 亚洲精品av麻豆狂野| 精品福利观看| 人人妻,人人澡人人爽秒播| 18禁国产床啪视频网站| 久久国产精品大桥未久av| 丝袜人妻中文字幕| 亚洲伊人久久精品综合| 最新美女视频免费是黄的| 丰满少妇做爰视频| 精品国产亚洲在线| 日本欧美视频一区| 成年人免费黄色播放视频| 国产福利在线免费观看视频| 精品国产乱码久久久久久小说| 多毛熟女@视频| 丰满少妇做爰视频| 国产无遮挡羞羞视频在线观看| 国产精品麻豆人妻色哟哟久久| av欧美777| 欧美av亚洲av综合av国产av| 亚洲成人国产一区在线观看| 91av网站免费观看| 嫁个100分男人电影在线观看| 狂野欧美激情性xxxx| av国产精品久久久久影院| 国产老妇伦熟女老妇高清| 18禁观看日本| 91麻豆精品激情在线观看国产 | 中文亚洲av片在线观看爽 | 久久久欧美国产精品| 国产精品自产拍在线观看55亚洲 | 一进一出抽搐动态| 成人18禁在线播放| 美国免费a级毛片| 欧美日韩黄片免| 欧美黑人精品巨大| 中文字幕另类日韩欧美亚洲嫩草| 国产av又大| 国产片内射在线| 亚洲专区字幕在线| 久久久久久人人人人人| 久热这里只有精品99| 黄色视频,在线免费观看| 成人黄色视频免费在线看| 欧美另类亚洲清纯唯美| 天天躁日日躁夜夜躁夜夜| 亚洲国产欧美日韩在线播放| 国产av一区二区精品久久| 性色av乱码一区二区三区2| 99热国产这里只有精品6| 国产aⅴ精品一区二区三区波| 欧美性长视频在线观看| 欧美+亚洲+日韩+国产| 亚洲精品美女久久久久99蜜臀| 精品福利永久在线观看| 国产麻豆69| 啦啦啦中文免费视频观看日本| 国产亚洲av高清不卡| 精品一区二区三卡| 国产av精品麻豆| 18禁黄网站禁片午夜丰满| 青青草视频在线视频观看| 一级黄色大片毛片| 久久国产精品男人的天堂亚洲| 人人妻人人澡人人爽人人夜夜| 两性夫妻黄色片| 黑人猛操日本美女一级片| av不卡在线播放| 99久久人妻综合| 亚洲中文av在线| 成人黄色视频免费在线看| 久久热在线av| 在线观看66精品国产| 精品一区二区三卡| 欧美激情高清一区二区三区| 精品一区二区三区四区五区乱码| 精品国内亚洲2022精品成人 | 黑人操中国人逼视频| 久久久久久人人人人人| 亚洲久久久国产精品| 视频在线观看一区二区三区| 2018国产大陆天天弄谢| 日韩免费高清中文字幕av| 久久人人97超碰香蕉20202| 一本一本久久a久久精品综合妖精| 久久免费观看电影| 777米奇影视久久| 精品卡一卡二卡四卡免费| 国产高清视频在线播放一区| 精品乱码久久久久久99久播| 18在线观看网站| 男女高潮啪啪啪动态图| 激情在线观看视频在线高清 | 欧美午夜高清在线| 亚洲精华国产精华精| 91麻豆av在线| 我要看黄色一级片免费的| 免费看a级黄色片| 女性生殖器流出的白浆| 久9热在线精品视频| 亚洲情色 制服丝袜| 久久国产精品影院| 两个人免费观看高清视频| 天天操日日干夜夜撸| 亚洲第一欧美日韩一区二区三区 | 精品国产一区二区三区四区第35| 精品国产一区二区三区久久久樱花| 黄色片一级片一级黄色片| 国产精品电影一区二区三区 | 久久久国产欧美日韩av| 99国产综合亚洲精品| 亚洲成a人片在线一区二区| 欧美日韩国产mv在线观看视频| 亚洲av成人不卡在线观看播放网| 国产在线免费精品| 18禁黄网站禁片午夜丰满| 一区二区三区国产精品乱码| www.自偷自拍.com| 日韩熟女老妇一区二区性免费视频| 精品国产乱码久久久久久小说| 国精品久久久久久国模美| 国产高清视频在线播放一区| 19禁男女啪啪无遮挡网站| 欧美日韩一级在线毛片| 久久青草综合色| 亚洲国产成人一精品久久久| 久久久水蜜桃国产精品网| 国产av又大| av国产精品久久久久影院| 亚洲国产欧美日韩在线播放| 国产午夜精品久久久久久| 欧美日韩福利视频一区二区| 中文字幕av电影在线播放| 老熟妇仑乱视频hdxx| 女性生殖器流出的白浆| 精品一区二区三区四区五区乱码| 人人妻人人添人人爽欧美一区卜| 激情在线观看视频在线高清 | 国产欧美日韩一区二区三| 夜夜爽天天搞| 黑人猛操日本美女一级片| 国产亚洲av高清不卡| 亚洲第一青青草原| 久久午夜亚洲精品久久| 脱女人内裤的视频| 纯流量卡能插随身wifi吗| 成人亚洲精品一区在线观看| 亚洲伊人久久精品综合| 午夜福利影视在线免费观看| 啦啦啦免费观看视频1| 亚洲国产欧美一区二区综合| av天堂久久9| 精品国产超薄肉色丝袜足j| 亚洲精品美女久久av网站| 精品国产乱码久久久久久小说| 亚洲中文日韩欧美视频| 国产亚洲精品第一综合不卡| 狠狠狠狠99中文字幕| 国产精品欧美亚洲77777| 日本黄色视频三级网站网址 | 人人妻人人澡人人爽人人夜夜| av片东京热男人的天堂| 国产在视频线精品| 国产xxxxx性猛交| 一级,二级,三级黄色视频| 黄片播放在线免费| 12—13女人毛片做爰片一| 成人免费观看视频高清| 精品一区二区三区四区五区乱码| 无限看片的www在线观看| 99re在线观看精品视频| 久久久久久久久久久久大奶| www.熟女人妻精品国产| 精品国产超薄肉色丝袜足j| 久久久水蜜桃国产精品网| 色婷婷av一区二区三区视频| www日本在线高清视频| 精品人妻在线不人妻| 两性夫妻黄色片| 男男h啪啪无遮挡| 国产日韩欧美亚洲二区| 男女下面插进去视频免费观看| 国产人伦9x9x在线观看| 女人被躁到高潮嗷嗷叫费观| 成在线人永久免费视频| 久久久久国产一级毛片高清牌| 欧美精品亚洲一区二区| 国产91精品成人一区二区三区 | 久久久久久久大尺度免费视频| 人人妻人人澡人人爽人人夜夜| 成年女人毛片免费观看观看9 | 午夜日韩欧美国产| 日本欧美视频一区| 高清毛片免费观看视频网站 | 欧美黑人欧美精品刺激| 99久久国产精品久久久| 欧美 亚洲 国产 日韩一| 国产精品国产av在线观看| 69精品国产乱码久久久| 天天躁日日躁夜夜躁夜夜| 国产高清激情床上av| 十八禁人妻一区二区| 日日爽夜夜爽网站| 欧美av亚洲av综合av国产av| 1024视频免费在线观看| 国产99久久九九免费精品| 午夜免费成人在线视频| 亚洲av日韩在线播放| 国产高清国产精品国产三级| 中文字幕制服av| 亚洲精品中文字幕一二三四区 | 亚洲,欧美精品.| 精品一区二区三区四区五区乱码| 老司机亚洲免费影院| 久久av网站| 色婷婷av一区二区三区视频| 欧美日韩av久久| 国产欧美亚洲国产| 国产精品亚洲av一区麻豆| 亚洲熟女毛片儿| 日韩熟女老妇一区二区性免费视频| 精品久久蜜臀av无| 黄网站色视频无遮挡免费观看| 老司机影院毛片| 伦理电影免费视频| 伊人久久大香线蕉亚洲五| 精品免费久久久久久久清纯 | 国产成人免费无遮挡视频| 美女午夜性视频免费| 一区二区三区精品91| 丰满少妇做爰视频| 久久久欧美国产精品| 久久久精品国产亚洲av高清涩受| 老司机在亚洲福利影院| 十八禁网站网址无遮挡| 狂野欧美激情性xxxx| 丰满饥渴人妻一区二区三| 亚洲九九香蕉| 国产片内射在线| 老熟女久久久| 电影成人av| 亚洲成人手机| 国产精品国产av在线观看| 国产成人一区二区三区免费视频网站| 久久久久网色| 日韩三级视频一区二区三区| 777米奇影视久久| 欧美 日韩 精品 国产| 男女下面插进去视频免费观看| 亚洲 欧美一区二区三区| 欧美精品高潮呻吟av久久| 日本av免费视频播放| 国产亚洲精品一区二区www | 亚洲精品美女久久av网站| av又黄又爽大尺度在线免费看| 超碰97精品在线观看| 18禁美女被吸乳视频| 黑人欧美特级aaaaaa片| 亚洲美女黄片视频| 香蕉国产在线看| 欧美精品啪啪一区二区三区| 在线天堂中文资源库| 国产男女内射视频| 久久久久久久国产电影| 亚洲黑人精品在线| 色综合婷婷激情| 久久精品国产亚洲av香蕉五月 | 一级片'在线观看视频| 女人被躁到高潮嗷嗷叫费观| 69av精品久久久久久 | 成人免费观看视频高清| 国产精品欧美亚洲77777| www.自偷自拍.com| 久久午夜综合久久蜜桃| 97在线人人人人妻| 嫁个100分男人电影在线观看| 一本综合久久免费| 欧美黄色片欧美黄色片| 一本—道久久a久久精品蜜桃钙片| 久久久精品区二区三区| 日本a在线网址| 免费在线观看日本一区| h视频一区二区三区| 国产成人一区二区三区免费视频网站| 亚洲专区国产一区二区| 黄色视频,在线免费观看| 国产精品一区二区免费欧美| 国产一区有黄有色的免费视频| 国产av又大| 777久久人妻少妇嫩草av网站| 成人免费观看视频高清| 最新美女视频免费是黄的| 国产又爽黄色视频| 热99re8久久精品国产| 国产精品免费视频内射| 丝袜美腿诱惑在线| 怎么达到女性高潮| 国产免费av片在线观看野外av| e午夜精品久久久久久久| 亚洲精品在线美女| 亚洲av欧美aⅴ国产| 精品少妇内射三级| 亚洲成av片中文字幕在线观看| 午夜久久久在线观看| 国产日韩欧美亚洲二区| 久久香蕉激情| 麻豆成人av在线观看| 性色av乱码一区二区三区2| 亚洲精品av麻豆狂野| 777米奇影视久久| 成人特级黄色片久久久久久久 | 免费久久久久久久精品成人欧美视频| www.自偷自拍.com| 欧美精品一区二区免费开放| 手机成人av网站| 久久中文字幕一级| 国产成人免费无遮挡视频| a级片在线免费高清观看视频| 大码成人一级视频| 久久精品国产a三级三级三级| 午夜福利在线观看吧| 国产精品久久久久成人av| 国产亚洲欧美在线一区二区| 亚洲情色 制服丝袜| 久久久精品免费免费高清| 日韩大片免费观看网站| 午夜视频精品福利| 最新的欧美精品一区二区| 五月天丁香电影| 国产精品av久久久久免费| 两个人看的免费小视频| 一区二区日韩欧美中文字幕| 亚洲成国产人片在线观看| 自线自在国产av| 香蕉国产在线看| 国产精品亚洲一级av第二区| 天天操日日干夜夜撸| 又黄又粗又硬又大视频| 色94色欧美一区二区| 日本av手机在线免费观看| 另类亚洲欧美激情| 国产男女内射视频| 亚洲第一av免费看| 色婷婷av一区二区三区视频| 久久久久久久大尺度免费视频| 在线观看免费日韩欧美大片| 一二三四在线观看免费中文在| 亚洲一码二码三码区别大吗| 香蕉久久夜色| 老司机影院毛片| 午夜福利视频精品| 亚洲精品美女久久av网站| 亚洲情色 制服丝袜| 国产不卡av网站在线观看| 欧美中文综合在线视频| 免费少妇av软件| 女人精品久久久久毛片| 黑人巨大精品欧美一区二区蜜桃| 久久久国产成人免费| 精品国产亚洲在线| 欧美日韩成人在线一区二区| 又紧又爽又黄一区二区| 亚洲国产欧美一区二区综合| 国产老妇伦熟女老妇高清| 精品国产一区二区三区久久久樱花| 美女福利国产在线| av有码第一页| 黄色毛片三级朝国网站| 99在线人妻在线中文字幕 | 午夜福利视频精品| 黄色视频不卡| 国产99久久九九免费精品| 国产欧美日韩精品亚洲av| 91大片在线观看| 国产精品国产av在线观看| 黑人猛操日本美女一级片| 午夜福利乱码中文字幕| av网站在线播放免费| 日韩视频在线欧美| 狂野欧美激情性xxxx| 日韩成人在线观看一区二区三区| 最新在线观看一区二区三区| 新久久久久国产一级毛片| 性少妇av在线| 久久精品国产a三级三级三级| 一区二区av电影网| 久久人人97超碰香蕉20202| 黄色片一级片一级黄色片| 亚洲 国产 在线| 国产精品美女特级片免费视频播放器 | 母亲3免费完整高清在线观看| 99国产精品一区二区三区| 精品免费久久久久久久清纯 | 在线观看免费视频日本深夜| 中亚洲国语对白在线视频| 亚洲色图av天堂| 天天操日日干夜夜撸| 亚洲色图av天堂| 久久免费观看电影| 亚洲专区国产一区二区| 又大又爽又粗| 国产亚洲一区二区精品| 成人手机av| 国产无遮挡羞羞视频在线观看| 后天国语完整版免费观看| 悠悠久久av| 亚洲人成电影免费在线| 日韩制服丝袜自拍偷拍| 国产一区二区在线观看av| 国产野战对白在线观看| 日韩大片免费观看网站| 丁香欧美五月| 国产成人啪精品午夜网站| 亚洲精品久久成人aⅴ小说| 久久久精品94久久精品| 亚洲视频免费观看视频| 久久热在线av| 在线天堂中文资源库| 成人精品一区二区免费| 亚洲性夜色夜夜综合| 夜夜骑夜夜射夜夜干| 亚洲av日韩在线播放| 9热在线视频观看99| 久久久久国内视频| 久久久久久免费高清国产稀缺| 久9热在线精品视频| 伊人久久大香线蕉亚洲五| 99热网站在线观看| 日本欧美视频一区| 欧美国产精品一级二级三级| 国产av一区二区精品久久| 91大片在线观看| 十八禁网站免费在线| 午夜福利视频精品| 日韩欧美免费精品| 激情在线观看视频在线高清 | 国内毛片毛片毛片毛片毛片| 午夜福利影视在线免费观看| 亚洲av第一区精品v没综合| 欧美激情久久久久久爽电影 | 两人在一起打扑克的视频| 一个人免费看片子| 欧美另类亚洲清纯唯美| 日韩欧美一区二区三区在线观看 | 在线观看免费午夜福利视频| 国产精品影院久久| 日韩中文字幕视频在线看片| 久久精品熟女亚洲av麻豆精品| 久久久精品94久久精品| 99精品欧美一区二区三区四区| 国产成人免费无遮挡视频| 精品国产一区二区三区久久久樱花| 免费在线观看视频国产中文字幕亚洲| 久久99一区二区三区| 久热爱精品视频在线9| 久久性视频一级片| 久久久久久久国产电影| 在线av久久热| 考比视频在线观看| 亚洲精品久久午夜乱码| 露出奶头的视频| 亚洲va日本ⅴa欧美va伊人久久| 久久免费观看电影| 飞空精品影院首页| 最新在线观看一区二区三区| 成年动漫av网址| 成人18禁高潮啪啪吃奶动态图| 久久久精品免费免费高清| 人妻久久中文字幕网| 美女午夜性视频免费| 国产高清国产精品国产三级| 久久亚洲精品不卡| 久久久国产一区二区| 国产高清激情床上av| 我的亚洲天堂| 露出奶头的视频| 色老头精品视频在线观看| 国产黄频视频在线观看| 黑人巨大精品欧美一区二区蜜桃| 大码成人一级视频| 宅男免费午夜| 国产成人精品久久二区二区免费| 在线看a的网站| 在线观看www视频免费| 国产麻豆69|