C 引用型別相比於值型別意義何在

時間 2021-06-02 08:59:22

1樓:ggffss

這個你要是寫過C++ 就知道 C++的引用型別由於比較弱雞,導致完全無法替代指標。

但是在C#來說引用型別基本已經覆蓋了絕大部分的指標使用場景。

到處都是C++的原始指標是很痛苦的,另外就算是C++的引用也要寫&符號,別的不說,太累。

要是微軟把 C++/CX 擴充套件開源就好了。

2樓:NekoFlan

1 你的棧大還是堆大?

2 題主這麼鄙視GC,那麼題主知道GC真正的作用是什麼嗎?

3 想讓你的想法實現,請用c++,不要用任何指標和堆變數試試能不能造個輪子出來

3樓:VTECISBEST

沒有接觸過C和彙編,永遠不知道意義何在。多說也無益。

你應該去看看組合語言第三版。只要你了解棧,了解函式的入參,區域性變數在棧中是如何體現的,你就知道了。

4樓:lymim lee

很久以前,人們的物資只有食物(現在的大多數動物還是這樣)後來,因為分工(漁獵農牧),人們開始交換物資以滿足需求後來,因為交易的便捷需求,出現了牲畜、象牙、布帛等一般等價物後來,為了進一步的便捷,出現了金銀銅等貨幣後來,為了進一步的便捷,出現了銀票、紙鈔

後來,出現了0和1

後來,就有了如今複雜、龐大、臃腫、低效的金融系統如果人們現在還是以物易物那該多好啊,我想要公尺就直接拿我家的布去換,沒有中間商賺差價~

0.計算機只有整數型別

1.擴充套件出浮點數、字元、bool等基本型別2.擴充套件出陣列、表、字串

3.擴充套件出結構

4.擴充套件出類和物件

5.為了統一上述部分或全部的型別,各程式語言已經走在引用型別的不歸路上了……

所以你還是得讓GC賺差價

5樓:來做遊戲吧

C#裡面值型別和引用型別最大的區別是:copy-by-value。而不是它們乙個放棧上,乙個放堆上。

值型別也是可以放堆上的。

另外,到底用值型別還是引用型別一般是考慮到記憶體對齊和快取命中的問題

6樓:Glavo

作用就是讓語言用起來簡單。

如果只有值型別的話,你就需要引入指標引用兩者中至少乙個,使用容器的時候需要考慮是放值還是指標,函式傳參以及返回的時候也要考慮是值型別還是指標,為了少些拷貝又引入了移動語義,filter、map等函式為了適應傳值傳指標等不同情況要麼過載一堆,要麼引入模板,再加上為了少拷貝引入原地建構函式所以需要可變參模板……到了最後你發現語言已經變成了C++。

7樓:Ivony

1、值型別大物件拷貝成本太高,結果,要用指標。

2、值型別成員是包含關係,所以沒法做迴圈引用和反向引用,又要引入指標。

引入了指標後,發現還是引用型別好用……

8樓:「已登出」

引用型別的引入主要是為了解決c語言的第乙個門檻,指標。很多人真的指不明白。

我舉個例子,假如你要做乙個遊戲,遊戲裡有三個單位,戰士,牧師,怪物,怪物打戰士,牧師奶戰士,為了保證怪物和牧師的目標是同乙個戰士,那麼戰士就必須是 ref戰士,或者引用型別戰士,而如果你這裡還有別的方法,如果你用ref戰士,那麼方法結束以後你的戰士丟了!

當然我知道還有別的解決方法,但是,和引用戰士比起來都不那麼好實現。

而且,純用值型別的話,你的語言是無法符合黎克特制替換原則的。

9樓:竹山塘一代小白

我最近寫的PPT還是有道理啊

值型別和引用型別是屬於語言的問題,和實現無關。

另外就算說底層實現,堆和棧有區別嗎?

再說一般實現,一般開的給棧用的空間都小的一匹。你以為大家都是寫OI是吧,沒事在棧上開大資料結構。

是的,.Net新出的span(最新的),他們的型別甚至是ref struct(只能放棧上)

寫個StackOverflow異常你就知道有沒有限制了還有這個問題下的某些回答簡直是在搞笑

「而C#為了簡化指標的用法,引入了值型別物件和引用型別物件。」???

說的cpp沒有引入值型別系統一樣

10樓:歲寒

我在實際程式設計中是比較少使用值型別的。值型別固然有其優點,但是他的缺點也是十分突出的。

首先,值型別的大小不能過大,一般是不要超過16個位元組,因為傳遞值型別的方式是複製整個值型別,如果值型別本身太大,複製開銷自然也就很大。

其次,值型別可能會導致頻繁的拆箱和裝箱操作,而且程式設計師可能沒有意識到這一點,這種情況下會增加意料之外的開銷甚至是錯誤行為。

所以只有在你足夠了解值型別,並且使用場景確實需要的情況下才使用它,否則你都應該使用引用型別。

11樓:雨花

所以很多遊戲開發用C++,你就有了4個選項:棧上的數值型別,棧上的類例項,堆上的數值型別,堆上的類例項,再加上對指標和引用的直接操作,可以自由傳遞位址或數值...

然後也會有一些坑,比如棧在呼叫結束後會被丟棄,所以傳棧內的指標出來會變成薛丁格的指標......說到底還是簡化了操作

12樓:趙劼

棧尺寸有限,每個執行緒的棧都是分開的,那麼假如他們要共享乙個資料怎麼辦?

棧和方法呼叫密切相關,方法退出了,棧上的一段資料就廢棄了,那麼兩個方法要共享一段資料怎麼辦?

所以就要有一快共享的記憶體區域來放資料嘛,這就出現了堆。

另外值型別沒法繼承,沒法用介面來引用(雖然泛型+介面解決部分問題)。

C 模板型別推斷和引用摺疊的聯絡?

王賽 左值和右值,指的不是變數本身的型別,而是變數構成的表示式值型別。表示式值型別是左值還是右值,有一套完整的定義規則,cppreference 上有,手機上答題,不方便找。針對這個題目,三個變數做引數,都屬於 id expression,屬於 lvaue 表示式,對應的具體型別實際上是 int 那...

C 模板右值引用推導的問題?

情況是這樣的 int i 10 foo i 首先進行 name lookup 找到了 2 個 foo,然後進行模板引數的歸約.第 1 個是 foo T with T int 第 2 個是 foo const T with T int 之後進行過載決議,優先順序從 完美匹配 型別提公升 型別轉換 依次...

c 為什麼要搞個引用岀來,特別是右值引用,感覺破壞了語法的簡潔和條理,拷貝乙個指標不是很好嗎?

王旭競 一 這樣說吧。對於已存在的物理資源來說,只有兩個狀態 可變 不可變。對於使用者來說,需要給物理資源命名,才能使用。對於名來說,有兩個狀態 有 資源 無 資源 所以綜合起來,對於給物理資源命名這件事,需要三個語意來操作 別名 二者唯一 複製 二者各一 移動 一有一無 二 邏輯上來說,別名 複製...