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...