加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的记忆组织

发布时间:2020-12-16 10:33:25 所属栏目:百科 来源:网络整理
导读:我一直在阅读有关如何在C中分配内存的内容. 一些资源要提到: http://www.geeksforgeeks.org/memory-layout-of-c-program/ http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory Object creation on the stack/heap? Global memory managem
我一直在阅读有关如何在C中分配内存的内容.

一些资源要提到:

http://www.geeksforgeeks.org/memory-layout-of-c-program/

http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory

Object creation on the stack/heap?

Global memory management in C++ in stack or heap?

http://msdn.microsoft.com/en-us/library/vstudio/dd293645.aspx

Heap / Stack and multiple processes

Do different programs gets their memory from a common heap or from a separate heap?

http://computer.howstuffworks.com/c28.htm

我想根据我的阅读澄清几点:

根据http://www.geeksforgeeks.org/memory-layout-of-c-program/第4节堆栈“堆栈,其中存储自动变量,以及每次调用函数时保存的信息”

假设:

class myClass{
  int a;
  char b;
  public:
  myClass(int a,char b)
  {
   this->a = a;
   this->b = b;
  } 
};

1)根据我所读到的,当我们编译这段代码时,二进制文件位于程序存储器中,并且还没有在堆栈上分配任何内容.正确?

现在在我的主要:

int main()
{
 myClass Ob(1,'c');
 return 0;
}

2)现在在堆栈上创建一个大小为5字节(4字节(整数),1字节(字符) – 32位OS)的对象Ob,因为它是一个自动变量.正确吗?

3)当调用构造函数myClass(int a,char b)时,临时变量(参数a,b)是否在构造函数的堆栈上创建,然后在创建对象Ob后销毁?就像我们通过按值传递参数来调用函数一样.

现在假设另一个班级

class pointerClass {
 int a;
 char* b;
 public:
 pointerClass(int size){
 b= new char[size];
 a=size;
 }
};

现在主要:

int main()
{
 pointerClass ptr(10) ; //Step 1
}

4)这是否意味着大小为8字节的ptr对象(int a(4字节),char * b(4字节,即这只是持有指向堆的地址)是在堆栈上创建的?还有10字节的内存(对应于新的char [10]在堆上分配)由char * b的内容指向?我是否正确?

5)当我们通过引用将参数传递给函数时,例如fn(int * a,char * b)或fn(int& a,char& b)这是否意味着在堆栈上创建临时指针/引用函数指向函数返回时传递和销毁的实际对象?或者更确切地说,传递实际对象而不是在函数的堆栈上创建和销毁临时指针/引用?

这是我昨天问的,但我对答案不满意:
Constructor,Copy Constructor and Stack Creation : C++

6)当我们重载一个fn,如fn(int a,char b)fn(int& a,char& b)时,我们可以从main调用fn(A,B)
以下演员
static_cast< void(*)(int,char)>(fn)(a,c); //调用fn(int a,char b)
static_cast< void(*)(int&,char&)>(fn)(a,c); //调用fn(int& a.char& b)
到底发生了什么?什么是空(*).

谢谢

解决方法

>正确 – 分配在运行时发生.
>部分正确 – 标准不使用术语堆栈和堆,它只需要来自对象的行为.但是,堆栈是实现此功能的最常见和最常用的方式.此外,允许编译器使用填充字节填充结构,因此不应推测对象的大小.这被称为 structure padding.简单地说,使用sizeof来获得大小.
>部分正确 – 按值传递和返回确实需要复制构造函数作为可访问的调用,但这些调用可能在某些情况下被省略.该过程称为 copy elision. >部分正确 – 指针只指向具有动态存储的对象.指针的大小可能会有所不同. >指针或引用是在函数本地创建的,但它指向或引用传递地址的对象.此处不需要复制,也不会发生任何副本. >每个变量都有一个C和C的数据类型.类型转换允许您灵活地强制编译器将指向一种数据类型的指针视为指向完全不同数据类型的指针.由于函数具有类型,因此指向函数的指针也具有类型,并且类型转换允许您强制编译器将函数指针从一种函数类型处理为完全另一种类型,从而基本上允许您调用所需的重载函数版本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读