用c ++编写结构内存分配

时间:2017-08-07 23:29:09

标签: c++ c memory structure instance

我们知道结构的内存是在定义变量时(或创建实例时)分配的。

现在

struct Programmer {
int skills;
int problemSolved;
};

int main(){
Programmer me;//Here the memory will be allocated but in what 
              //format(discrete or continuous block of memory)?
me.skills = 10;
me.problemSolved = 2000;
return 0;
}

分配给结构实例或变量的内存是连续块(如在数组中)还是在离散的内存块中?如果是,那么为什么?

2 个答案:

答案 0 :(得分:2)

结构在堆栈中分配,在一个连续的内存块中(在这种情况下可能是64位)。它是在调用函数时分配的(除非你的编译器做了一些棘手的事情)。

所有实例变量都在堆栈上分配(尽管未指定它们如何在标准中分配,这就是所有编译器的工作方式)。原因是,当您以递归方式调用函数时,它将为更多变量获取新的堆栈帧。这样,如果你有一个变量" me"在堆栈上,你从main()中调用main(),最后得到第二个" me"第二个堆栈框架中的变量。当第二个" main()"返回后,堆栈帧将被释放以供将来调用。

答案 1 :(得分:2)

struct分配的内存是连续的。来自C11标准草案的§6.2.5 ¶20

  

结构类型描述了顺序分配的非空集   成员对象....

但是,根据§6.7.2.1 ¶15,为struct分配的存储空间可能存在填充:

  

结构对象中可能有未命名的填充,但不在其中   开始。

而且,来自6.7.2.1 ¶17

  

结构或联合的末尾可能有未命名的填充。