1、調整visio的畫布大小
按住Ctrl鼠標移動到畫布邊緣即可
2、兩個棧實現一個隊列
一個棧用於入隊,一個用於出隊
#include<iostream> #include<stack> using namespace std; template<class T> struct MyQueue { void push(T &t) //入隊操作,通過s1實現 { s1.push(t); } T front() //作用是把棧s1中的元素壓入棧s2 { if(s2.empty()) { if(s1.size()==0) throw; while(!s1.empty()) { s2.push(s1.top()); s1.pop(); } } return s2.top(); } void pop() //從s2出棧 { if(s2.empty()) { while(!s1.empty()) { s2.push(s1.top()); s1.pop(); } } if(!s2.empty()) { s2.pop(); } } stack<int> s1; stack<int> s2; }; int main() { MyQueue<int> mq; int i; for(i=0;i<10;i++) { mq.push(i); } for(i=0;i<10;i++) { cout<<mq.front()<<endl; mq.pop(); } system("pause"); return 0; }
3、堆,空閑內存地址鏈表鏈表
比如我要分配80個字節,現在有兩個相鄰的空閑塊,每塊50字節,假設沒有其他空閑塊,這樣內部分配函數第一次調用找不到滿足要求的塊,失敗,這時我們要調用合並空閑塊函數,將連續的空閑塊合並成一個大的空閑塊,之后再次調用內部分配函數,所以用一個外部內存分配函數把這些過程封裝起來。還有一種空閑塊合並策略,就是立即合並,每次釋放的時候要檢查前后有沒有空閑塊,當然也需要其他的一些信息,這些《深入理解計算機系統》里都有講到。
《深入理解計算機系統》
4、關於堆最大可以分配的內存(win7 32位的對內存連1.6G都分配不了)
32位的系統能操作的地址空間只有2的32次,也就是4G,所以無論虛擬空間多大,堆最大能分配多大。
#include<stdio.h>//win7 32位的對內存連1.6G都分配不了 void main() { int *Test=new int[1024*1024*200];//分配800M=4B*(200*1024*1024)=4B*(200*1K*1K)=4B*(200*1M)=4B*200*1M=800MB內存 int* Test2=new int[1024*1024*200];// 分配800M內存 }
malloc返回的地址只是邏輯地址空間的一個地址值。在使用該地址的時候才由操作系統映射到物理內存去訪問內存數據。不存在malloc直接返回物理內存的說法。即使用VirtualAlloc分配的虛擬內存,提交以后還不是照樣要分配物理內存。知道使用的地址是邏輯空間地址,使用該地址的時候由操作系統做映射到物理內存的動作就可以了
5、可用內存空間鏈表