ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

C++程序代码的内存结构分析

2021-03-26 15:00:52  阅读:172  来源: 互联网

标签:CClassAddress study C++ 内存 cpp huGuohua xcode 程序代码 location


C++程序内部的结构,同C程序的内部结构,也是分段的,一般分为代码段、堆、栈、数据段等。可以通过下面的代码来证明:

CClassAddress.hpp 文件:

#ifndef CClassAddress_hpp
#define CClassAddress_hpp

class CClassAddress
{
public:
    CClassAddress();
    int getNum1();
    void setNum1(int a);

private:
    int mPrvNum1;
public:
    char mPubChar1;
};

#endif /* CClassAddress_hpp */

 

CClassAddress.cpp文件:

#include "CClassAddress.hpp"
#include <iostream>

using namespace std;

CClassAddress::CClassAddress()
{
    cout << __FILE__ << ":" << __LINE__ <<":"<<__FUNCTION__<<"\tlocation is\t"<<(void*)&(__FUNCTION__)<<endl;
    mPrvNum1=0;
    mPubChar1=0;
}

int CClassAddress::getNum1()
{
    cout << __FILE__ << ":" << __LINE__ <<":"<<__FUNCTION__<<"\tlocation is\t"<<(void*)&(__FUNCTION__)<<endl;
    cout<<"mPrvNum1 location is\t"<<(void*)&(mPrvNum1)<<endl;
    return mPrvNum1;
}

void CClassAddress::setNum1(int a)
{
    cout << __FILE__ << ":" << __LINE__ <<":"<<__FUNCTION__<<"\tlocation is "<<(void*)&(__FUNCTION__)<<endl;
    this->mPrvNum1 = a;
}

 

main文件:

#include "CClassAddress.hpp"
#include <iostream>

int main(int argc, const char * argv[]) {
    std::cout<<__FILE__ << ":" << __LINE__<<":"<<__FUNCTION__ << "\t"<<(void*)&__FUNCTION__<<endl;

    CClassAddress classAdd;
    cout << __FILE__ << ":" << __LINE__ << ":" <<"local classAdd: location is\t"<< (void*)&classAdd << endl;
    classAdd.setNum1(10);
    int a = classAdd.getNum1();
    cout << __FILE__ << ":" << __LINE__ << ":" <<"local a: location is\t"<< (void*)&a << endl;
    cout << __FILE__ << ":" << __LINE__ << ":" <<"public classAdd.mPubChar1: location is\t"<< (void*)&classAdd.mPubChar1 << endl;

    static int sIntA=10;
    cout << __FILE__ << ":" << __LINE__ << ":" <<"static int sIntA: location is\t"<< (void*)&sIntA << endl;

    cout<<"================="<<endl;
    CClassAddress *p_classAdd = new CClassAddress();
    cout << __FILE__ << ":" << __LINE__ << ":" <<"local *p_classAdd: location is\t"<< (void*)&p_classAdd << endl;
    cout << __FILE__ << ":" << __LINE__ << ":" <<"local &(*p_classAdd): location is\t"<< &(*p_classAdd) << endl;
    p_classAdd->setNum1(11);
    p_classAdd->getNum1();
    cout << __FILE__ << ":" << __LINE__ << ":" <<"public p_classAdd->mPubChar1: location is\t"<< (void*)&(p_classAdd->mPubChar1) << endl;
    delete p_classAdd;
    return 0;
}

 

程序的执行结果:
/Users/huGuohua/xcode/cpp_study/cpp_study/main.cpp:167:main    0x1000235a2
/Users/huGuohua/xcode/cpp_study/cpp_study/CClassAddress.cpp:16:CClassAddress    location is    0x1000236dd
/Users/huGuohua/xcode/cpp_study/cpp_study/main.cpp:170:local classAdd: location is    0x7ffeefbff438
/Users/huGuohua/xcode/cpp_study/cpp_study/CClassAddress.cpp:30:setNum1    location is 0x100023717
/Users/huGuohua/xcode/cpp_study/cpp_study/CClassAddress.cpp:23:getNum1    location is    0x1000236f9
mPrvNum1 location is    0x7ffeefbff438
/Users/huGuohua/xcode/cpp_study/cpp_study/main.cpp:173:local a: location is    0x7ffeefbff434
/Users/huGuohua/xcode/cpp_study/cpp_study/main.cpp:174:public classAdd.mPubChar1: location is    0x7ffeefbff43c
/Users/huGuohua/xcode/cpp_study/cpp_study/main.cpp:177:static int sIntA: location is    0x100024350
=================
/Users/huGuohua/xcode/cpp_study/cpp_study/CClassAddress.cpp:16:CClassAddress    location is    0x1000236dd
/Users/huGuohua/xcode/cpp_study/cpp_study/main.cpp:181:local *p_classAdd: location is    0x7ffeefbff428
/Users/huGuohua/xcode/cpp_study/cpp_study/main.cpp:182:local &(*p_classAdd): location is    0x1039110a0
/Users/huGuohua/xcode/cpp_study/cpp_study/CClassAddress.cpp:30:setNum1    location is 0x100023717
/Users/huGuohua/xcode/cpp_study/cpp_study/CClassAddress.cpp:23:getNum1    location is    0x1000236f9
mPrvNum1 location is    0x1039110a0
/Users/huGuohua/xcode/cpp_study/cpp_study/main.cpp:185:public p_classAdd->mPubChar1: location is    0x1039110a4
Program ended with exit code: 0

根据以上的结果,可以发现如下规律:
不管是main函数还是类内部的函数,地址在一起,放在代码段的;
不管是普通函数中的变量还是类中的变量,地址在一起,放在栈段的;
static的的变量,地址放在全局变量的数据段;
如果一个对象是用new创建的,他的数据放在堆中;

这就是内存中的进程的几个段:
代码段存放可执行代码、字符串常量、常量数据;
数据段存放已初始化全局变量、静态变量;
栈存放局部变量、函数参数;
堆是用来动态内存分配的;

由此可见:
C和C++的区别,只是从开发人员的角度来看,他的代码是不同,在内存中的结构是完全一样的。如果把类名和域运算符和成员函数看成一个整体,那么C++的代码,就是C结构的面向过程的了。

 

标签:CClassAddress,study,C++,内存,cpp,huGuohua,xcode,程序代码,location
来源: https://blog.csdn.net/hawanglc/article/details/115244396

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有