第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在C+中,I+和+i之間是否存在性能差異?

在C+中,I+和+i之間是否存在性能差異?

C++ C
ITMISS 2019-06-06 15:42:12
在C+中,I+和+i之間是否存在性能差異?我們有個(gè)問(wèn)題..i++和++i 在C中?C+的答案是什么?
查看完整描述

3 回答

?
慕絲7291255

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

[執(zhí)行摘要:使用++i如果你沒(méi)有明確的理由使用i++.]

對(duì)于C+來(lái)說(shuō),答案要復(fù)雜一些。

如果i是一個(gè)簡(jiǎn)單類型(不是C+類的實(shí)例),然后給出C的答案(“不,沒(méi)有性能差異”)保留,因?yàn)榫幾g器正在生成代碼。

但是,如果i是C+類的實(shí)例,那么i++++i打電話給其中一個(gè)operator++職能。下面是這些函數(shù)的標(biāo)準(zhǔn)對(duì):

Foo& Foo::operator++()   // called for ++i{
    this->data += 1;
    return *this;}Foo Foo::operator++(int ignored_dummy_value)   // called for i++{
    Foo tmp(*this);   // variable "tmp" cannot be optimized away by the compiler
    ++(*this);
    return tmp;}

因?yàn)榫幾g器沒(méi)有生成代碼,而只是調(diào)用operator++函數(shù),則無(wú)法優(yōu)化tmp變量及其關(guān)聯(lián)的復(fù)制構(gòu)造函數(shù)。如果復(fù)制構(gòu)造函數(shù)很昂貴,那么這會(huì)對(duì)性能產(chǎn)生重大影響。


查看完整回答
反對(duì) 回復(fù) 2019-06-06
?
大話西游666

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊

是。的確有。

+運(yùn)算符可以定義為函數(shù),也可以不定義為函數(shù)。對(duì)于原語(yǔ)類型(int,Double,.)操作符是內(nèi)置的,所以編譯器可能能夠優(yōu)化您的代碼。但是,對(duì)于定義+操作符的對(duì)象,情況就不同了。

運(yùn)算符+(Int)函數(shù)必須創(chuàng)建副本。這是因?yàn)轭A(yù)期后綴+將返回與其持有的值不同的值:它必須在臨時(shí)變量中保存其值,增加其值并返回臨時(shí)值。在操作符+()、前綴+的情況下,不需要?jiǎng)?chuàng)建副本:對(duì)象可以自己遞增,然后返回自己。

這里有一個(gè)例子說(shuō)明了這一點(diǎn):

struct C{
    C& operator++();      // prefix
    C  operator++(int);   // postfixprivate:

    int i_;};C& C::operator++(){
    ++i_;
    return *this;   // self, no copy created}C C::operator++(int ignored_dummy_value){
    C t(*this);
    ++(*this);
    return t;   // return a copy}

每次調(diào)用運(yùn)算符+(Int)時(shí),您都必須創(chuàng)建一個(gè)副本,而編譯器不能對(duì)它做任何事情。給出選擇時(shí),使用運(yùn)算符+();這樣就不會(huì)保存副本。在許多增量(大循環(huán)?)的情況下,它可能是重要的。和/或大型物體。


查看完整回答
反對(duì) 回復(fù) 2019-06-06
?
烙印99

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊

以下是增量操作符位于不同轉(zhuǎn)換單元時(shí)的基準(zhǔn)。編譯器與g+4.5。

暫時(shí)忽略樣式問(wèn)題

// a.cc#include <ctime>#include <array>class Something {public:
    Something& operator++();
    Something operator++(int);private:
    std::array<int,PACKET_SIZE> data;};int main () {
    Something s;

    for (int i=0; i<1024*1024*30; ++i) ++s; // warm up
    std::clock_t a = clock();
    for (int i=0; i<1024*1024*30; ++i) ++s;
    a = clock() - a;

    for (int i=0; i<1024*1024*30; ++i) s++; // warm up
    std::clock_t b = clock();
    for (int i=0; i<1024*1024*30; ++i) s++;
    b = clock() - b;

    std::cout << "a=" << (a/double(CLOCKS_PER_SEC))
              << ", b=" << (b/double(CLOCKS_PER_SEC)) << '\n';
    return 0;}

O(N)增量

試驗(yàn)

// b.cc#include <array>class Something {public:
    Something& operator++();
    Something operator++(int);private:
    std::array<int,PACKET_SIZE> data;};Something& Something::operator++(){
    for (auto it=data.begin(), end=data.end(); it!=end; ++it)
        ++*it;
    return *this;}Something Something::operator++(int){
    Something ret = *this;
    ++*this;
    return ret;}

結(jié)果

虛擬機(jī)上g+4.5的結(jié)果(以秒為單位):

Flags (--std=c++0x)       ++i   i++-DPACKET_SIZE=50 -O1      1.70  2.39-DPACKET_SIZE=50 -O3      0.59  1.00-DPACKET_SIZE=500 -O1 
   10.51 13.28-DPACKET_SIZE=500 -O3     4.28  6.82

O(1)增量

試驗(yàn)

現(xiàn)在讓我們來(lái)看以下文件:

// c.cc#include <array>class Something {public:
    Something& operator++();
    Something operator++(int);private:
    std::array<int,PACKET_SIZE> data;};Something& Something::operator++(){
    return *this;}Something Something::operator++(int){
    Something ret = *this;
    ++*this;
    return ret;}

它在增量中什么也不做。這模擬了增量具有恒定復(fù)雜性的情況。

結(jié)果

現(xiàn)在的結(jié)果差別很大:

Flags (--std=c++0x)       ++i   i++-DPACKET_SIZE=50 -O1      0.05   0.74-DPACKET_SIZE=50 -O3      0.08   0.97-DPACKET_SIZE=500 -O1
     0.05   2.79-DPACKET_SIZE=500 -O3     0.08   2.18-DPACKET_SIZE=5000 -O3    0.07  21.90

結(jié)語(yǔ)

性能方面

如果您不需要前面的值,請(qǐng)養(yǎng)成使用預(yù)增量的習(xí)慣。即使使用內(nèi)置類型,也要保持一致,如果您用自定義類型替換內(nèi)置類型,您將不會(huì)有遭受不必要的性能損失的風(fēng)險(xiǎn)。

語(yǔ)義層面

  • i++

    說(shuō)

    increment i, I am interested in the previous value, though.

  • ++i

    說(shuō)

    increment i, I am interested in the current value

    increment i, no interest in the previous value

    ..再說(shuō)一遍,你會(huì)習(xí)慣的,即使你現(xiàn)在還不習(xí)慣。

克努斯。

過(guò)早的優(yōu)化是萬(wàn)惡之源。這是過(guò)早的悲觀。


查看完整回答
反對(duì) 回復(fù) 2019-06-06
  • 3 回答
  • 0 關(guān)注
  • 788 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)