C++内存分布探讨,x86和x64位的细微区别
生活随笔
收集整理的這篇文章主要介紹了
C++内存分布探讨,x86和x64位的细微区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
網上在探討C++內存分布的時候,大都是下面這種圖,
外加上這么一句話:“棧區申請空間的地址(表示地址的八個十六進制數)是從大到小的,堆區申請空間地址是從小到大的。”
但是,小編編譯器用x86和x64運行出結果恰好是相反的!
參考文章1:常規內存分布
《C/C++程序內存的分布》
參考文章2:棧堆地址高低次序測試1
《棧堆地址高低次序問題》
int main() {printf("*************** 棧 ***************\n");int a;int b;printf("a=%x,b=%x\n", &a, &b);int d[10];for (int i = 0; i < 10; i++){printf("d[%d]=%x\n", i, &d[i]);}printf("*************** 堆 ***************\n");int* c = new int;printf("c=%x\n", c);int* e = new int[10];for (int i = 0; i < 10; i++){printf("e[%d]=%x\n", i, &e[i]);}//delete c, c = nullptr;int* f = new int;printf("f=%x\n", f);return 0; }32位測試結果
*************** 棧 *************** a=f6fe70,b=f6fe64 d[0]=f6fe34 d[1]=f6fe38 d[2]=f6fe3c d[3]=f6fe40 d[4]=f6fe44 d[5]=f6fe48 d[6]=f6fe4c d[7]=f6fe50 d[8]=f6fe54 d[9]=f6fe58 *************** 堆 *************** c=fd43f0 e[0]=fd9d60 e[1]=fd9d64 e[2]=fd9d68 e[3]=fd9d6c e[4]=fd9d70 e[5]=fd9d74 e[6]=fd9d78 e[7]=fd9d7c e[8]=fd9d80 e[9]=fd9d84 f=fd442064位測試結果
*************** 棧 *************** a=c6d3f894,b=c6d3f8b4 d[0]=c6d3f8d8 d[1]=c6d3f8dc d[2]=c6d3f8e0 d[3]=c6d3f8e4 d[4]=c6d3f8e8 d[5]=c6d3f8ec d[6]=c6d3f8f0 d[7]=c6d3f8f4 d[8]=c6d3f8f8 d[9]=c6d3f8fc *************** 堆 *************** c=73d646a0 e[0]=73d72f70 e[1]=73d72f74 e[2]=73d72f78 e[3]=73d72f7c e[4]=73d72f80 e[5]=73d72f84 e[6]=73d72f88 e[7]=73d72f8c e[8]=73d72f90 e[9]=73d72f94 f=73d65d40棧堆地址高低次序測試2
#include <iostream> using namespace std; //全局變量 未初始化 int g1; int g2 = 0; int g3 = 1; int g4 = 2; static int sg1 = 3; int main(int argc, char* argv[]) {static int s1 = 5;cout << "memory address!" << endl;//代碼區 .textcout << "代碼區 main = " << main << endl;cout << "全局未初始化 g1=" << &g1 << endl;cout << "全局初始化為0 g2=" << &g2 << endl;cout << "全局初始化為1 g3=" << &g3 << endl;cout << "全局初始化為2 g4=" << &g4 << endl;cout << "靜態全局初始化為3 sg1=" << &sg1 << endl;cout << "靜態局部初始化為5 s1=" << &s1 << endl;int* p1 = new int;int* p2 = new int;cout << "堆空間地址 p1=" << p1 << endl;cout << "堆空間地址 p2=" << p2 << endl;cout << "指針變量的棧空間地址 &p1=" << &p1 << endl;cout << "指針變量的棧空間地址 &p2=" << &p2 << endl;int i1 = 100;int i2 = 101;cout << "棧空間地址 i1=" << &i1 << endl;cout << "棧空間地址 i2=" << &i2 << endl; }32位測試結果
memory address! 代碼區 main = 00511267 全局未初始化 g1=0051C3E8 全局初始化為0 g2=0051C3EC 全局初始化為1 g3=0051C000 全局初始化為2 g4=0051C004 靜態全局初始化為3 sg1=0051C008 靜態局部初始化為5 s1=0051C010 堆空間地址 p1=01437670 堆空間地址 p2=01440AD8 指針變量的棧空間地址 &p1=00DFFDD0 指針變量的棧空間地址 &p2=00DFFDC4 棧空間地址 i1=00DFFDB8 棧空間地址 i2=00DFFDAC64位測試結果
memory address! 代碼區 main = 00007FF673F111E0 全局未初始化 g1=00007FF673F1F460 全局初始化為0 g2=00007FF673F1F464 全局初始化為1 g3=00007FF673F1F000 全局初始化為2 g4=00007FF673F1F004 靜態全局初始化為3 sg1=00007FF673F1F008 靜態局部初始化為5 s1=00007FF673F1F010 堆空間地址 p1=0000023D6104BDF0 堆空間地址 p2=0000023D6104AD80 指針變量的棧空間地址 &p1=000000F1E30FFA38 指針變量的棧空間地址 &p2=000000F1E30FFA58 棧空間地址 i1=000000F1E30FFA74 棧空間地址 i2=000000F1E30FFA94總結
以上是生活随笔為你收集整理的C++内存分布探讨,x86和x64位的细微区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle-12:伪列rowid和ro
- 下一篇: 计算机的it入门知识点,基础乐理知识点电