誰動了我的const引用(2)

2021-07-10 13:20:06 字數 1809 閱讀 2289

1:對於兩個指標指向同一塊記憶體,乙個釋放,另乙個怎麼知道的問題?

#include#include#includeusing namespace std;

int main()

結果:hello world !

hello world !

hello world !

hello world !

p1 null

p2 not null

r2 null

*p3 null

根據結果,可以看到,我們通過引用

r2和多級指標

p3都可以知道

p1的記憶體得到了釋放。

2:上篇文章中的程式,其實主要的硬傷在於返回的引用是個區域性變數,在棧中存放,程式返回就釋放了,所以導致最後兩次列印的結果不一致。這個文章中已經說明。

3:上篇文章中說引用的本質,細想想,按c++的說明,引用只是乙個別名,不是物件,不佔記憶體。在程式的實現方式來說,只能

通過位址來實現,這樣看來其實只是編譯器幫我們多做了解引用的操作,而這個操作對於使用者來說是看不到的。

4:我們再來看看是不是引用作為引數真的節省空間

#include#include#includeusing namespace std;

struct a;

int funa(a i)

int funa1(a &i)

int funa2(a *i)

int main()

其中三處呼叫的反彙編如下:

funa(a);//物件

01056236 sub esp,10h

01056239 mov eax,esp

0105623b mov ecx,dword ptr [a]

0105623e mov dword ptr [eax],ecx

01056240 mov edx,dword ptr [ebp-2ch]

01056243 mov dword ptr [eax+4],edx

01056246 mov ecx,dword ptr [ebp-28h]

01056249 mov dword ptr [eax+8],ecx

0105624c mov edx,dword ptr [ebp-24h]

0105624f mov dword ptr [eax+0ch],edx

01056252 call funa (01051046h)

01056257 add esp,10h

funa1(a);//引用

0105625a lea eax,[a]

0105625d push eax

0105625e call funa1 (01051028h)

01056263 add esp,4

funa2(&a);//指標

01056266 lea eax,[a]

01056269 push eax

0105626a call funa2 (0105132fh)

0105626f add esp,4

我們看到物件的傳值會進行拷貝,而引用和指標其實都是傳了乙個位址。所以引用的節省空間只是針對物件本身來說

,跟指標相比,並不能節省什麼。

誰動了我的PID

1,pid是乙個閉環控制演算法。因此要實現pid演算法,必須在硬體上具有閉環控制,就是得有反饋。比如控制乙個電機的轉速,就得有乙個測量轉速的感測器,並將結果反饋到控制路線上,下面也將以轉速控制為例。2,pid是比例 p 積分 i 微分 d 控制演算法。但並不是必須同時具備這三種演算法,也可以是pd,...

誰動了我的PID

1,pid是乙個閉環控制演算法。因此要實現pid演算法,必須在硬體上具有閉環控制,就是得有反饋。比如控制乙個電機的轉速,就得有乙個測量轉速的感測器,並將結果反饋到控制路線上,下面也將以轉速控制為例。2,pid是比例 p 積分 i 微分 d 控制演算法。但並不是必須同時具備這三種演算法,也可以是pd,...

誰動了我的Config

概述 國內主要網路裝置的廠商是思科和華為為代表的國內和國外廠商。這些廠商的網路裝置的交流作業系統的名字不同,操作的命令也不一樣,但是實現的機理是一樣的。下面就以思科的網路裝置為例來做介紹,其它廠商的也類似。思科的網路裝置的作業系統主要是iso,即cisco internetwork operatin...