日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++内存分布探讨,x86和x64位的细微区别

發(fā)布時(shí)間:2023/12/14 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++内存分布探讨,x86和x64位的细微区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(wǎng)上在探討C++內(nèi)存分布的時(shí)候,大都是下面這種圖,
外加上這么一句話(huà):“棧區(qū)申請(qǐng)空間的地址(表示地址的八個(gè)十六進(jìn)制數(shù))是從大到小的,堆區(qū)申請(qǐng)空間地址是從小到大的。”
但是,小編編譯器用x86和x64運(yùn)行出結(jié)果恰好是相反的!

參考文章1:常規(guī)內(nèi)存分布

《C/C++程序內(nèi)存的分布》

參考文章2:棧堆地址高低次序測(cè)試1

《棧堆地址高低次序問(wèn)題》

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位測(cè)試結(jié)果

*************** 棧 *************** 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=fd4420

64位測(cè)試結(jié)果

*************** 棧 *************** 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

棧堆地址高低次序測(cè)試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;//代碼區(qū) .textcout << "代碼區(qū) main = " << main << endl;cout << "全局未初始化 g1=" << &g1 << endl;cout << "全局初始化為0 g2=" << &g2 << endl;cout << "全局初始化為1 g3=" << &g3 << endl;cout << "全局初始化為2 g4=" << &g4 << endl;cout << "靜態(tài)全局初始化為3 sg1=" << &sg1 << endl;cout << "靜態(tài)局部初始化為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位測(cè)試結(jié)果

memory address! 代碼區(qū) main = 00511267 全局未初始化 g1=0051C3E8 全局初始化為0 g2=0051C3EC 全局初始化為1 g3=0051C000 全局初始化為2 g4=0051C004 靜態(tài)全局初始化為3 sg1=0051C008 靜態(tài)局部初始化為5 s1=0051C010 堆空間地址 p1=01437670 堆空間地址 p2=01440AD8 指針變量的棧空間地址 &p1=00DFFDD0 指針變量的棧空間地址 &p2=00DFFDC4 棧空間地址 i1=00DFFDB8 棧空間地址 i2=00DFFDAC

64位測(cè)試結(jié)果

memory address! 代碼區(qū) main = 00007FF673F111E0 全局未初始化 g1=00007FF673F1F460 全局初始化為0 g2=00007FF673F1F464 全局初始化為1 g3=00007FF673F1F000 全局初始化為2 g4=00007FF673F1F004 靜態(tài)全局初始化為3 sg1=00007FF673F1F008 靜態(tài)局部初始化為5 s1=00007FF673F1F010 堆空間地址 p1=0000023D6104BDF0 堆空間地址 p2=0000023D6104AD80 指針變量的棧空間地址 &p1=000000F1E30FFA38 指針變量的棧空間地址 &p2=000000F1E30FFA58 棧空間地址 i1=000000F1E30FFA74 棧空間地址 i2=000000F1E30FFA94

總結(jié)

以上是生活随笔為你收集整理的C++内存分布探讨,x86和x64位的细微区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。