C++:对象及成员变量在内存中的存储分析

类的成员变量并不能决定自身的存储空间位置。决定存储位置的是对象的创建方式。

即:

如果对象是函数内的非静态局部变量,则对象,对象的成员变量保存在栈区。

如果对象是全局变量,则对象,对象的成员变量保存在静态区。

如果对象是函数内的静态局部变量,则对象,对象的成员变量保存在静态区。

如果对象是new出来的,则对象,对象的成员变量保存在堆区。

下面是一个示例:当对象是new出来的时,其对象地址和成员变量、成员变量的成员变量、成员变量存储的数据都在堆区存储。

struct  SQL{
  SQL() { memset(s, 0, 128); a = 0; strcpy(s, "hello"); }
  int a;
  char s[128];
};

class TEST {
 public:
  int a;
  SQL sql_;
};

int main() {

  TEST* test;

  {
    test = new TEST();
  }
  
  std::cout << "test:" <<  test << std::endl; //test对象的地址
  
  std::cout << "test->a:" <<  &(test->a) << std::endl;//test对象成员变量a的地址
  
  printf("test->sql_: %p\n", &(test->sql_));

  printf("test->sql_.a: %p\n", &(test->sql_.a));
  printf("test->sql_.s: %p\n", &(test->sql_.s));
  printf("test->sql_.s第一个字符: %p\n", &(test->sql_.s[0]));
  
  delete test;
  return 0;
}

/*
test:0x143a010
test->a:0x143a010
test->sql_: 0x143a014
test->sql_.a: 0x143a014
test->sql_.s: 0x143a018
test->sql_.s第一个字符: 0x143a018
*/

 

你可能感兴趣的:(C/C++,C++,对象存储)