c#沒有指標導致的效能問題研究一二

來源:互聯網
上載者:User

 

題目起的好吧。

結構類型可以在棧分配空間,而參考型別只能分配指標。

通過數組,結構類型可以分配一個連續的空間和一個指標。

數組結合參考型別只能分配連續的指標,和零散的空間。這是效能問題的一個潛在點。

因此要做序列化的東西,而又比較在意效能,數組結合結構類型是有必要的。

沒有指標,可以用下標來訪問,也就是枚舉數組的元素,需要返回數組本身(指標)和他當前的下標(自然數)兩樣東西,這沒有指標方便,但基本可以滿足要求。

問題是,很多資料結構的api並不返回數組和下標,而是傳回值本身。如果該值是參考型別,那麼還能當指標來使用,如果該值是實值型別,那就不能枚舉元素了。

也許我們不需要枚舉元素,只需要改變元素,提取實值型別元素就是複製一份這種設定,也是效能問題的潛在點。

想返回指標而不是值怎麼辦?返回可以訪問它的對象和訪問的方法參數。

如二叉樹,節點對象持有實值型別,而有兩個指標指向左右節點。一般資料結構api傳回值,那麼你就無法修改該節點的。唯一的方法是你返回該節點。

如數組,節點是值,傳回值就無法修改這個節點的值,而需要返回數組,和該節點的下標。

.net內建的類庫我們沒辦法更改,但是要實現高效能的資料結構,就需要考慮提供引用訪問的介面,避免無意義的複製。

c#內建的可枚舉類型(IEnumerable),列舉程式(IEnumerator)類似以上概念,但是返回的當前枚舉所持有的值是不可修改的,第二,它是一個遍曆用途的工具,從0開始,而不是從你需要使用的項開始。比如你想返回數組第3項,但是可枚舉類型會返回一個列舉程式,它的下標是從-1開始的。

理想的設計應該類似是:

class Tor<Node,T>{

Node node;

int i;

pubulic T Value{get{return node[i];}set{node[i] = value}}

public bool move(){if(node.Length > i){i++;return ture;}else return flase;};

public Tor(Node n, int index){node = n; i = index);

}

 

static void main(){

int [] m  = {0,1,2,3,4};

Tor<int[],int> t = new Tor(m, 2);

t.Value = 5;

while (t.move) t.Value  = 0;

List<int> list = new List<int>(Enumerable.Rangle(0,4));

Tor<List<int>,int> t = new Tor(list, 2);

}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.