【问题标题】:Structure memory allocation in c++c++中的结构内存分配
【发布时间】:2017-08-07 23:29:08
【问题描述】:

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

现在

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;
}

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

【问题讨论】:

  • 是的,但请记住有填充(并非总是如此)。
  • 在结构中,您可以保证的只是成员将按照声明的顺序进行分配。允许编译器插入“填充”字节,作为对齐目的的示例。
  • @ThomasMatthews——还保证struct的开头不会有填充。

标签: c++ c memory structure instance


【解决方案1】:

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

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

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

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

还有,来自6.7.2.1 ¶17

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

【讨论】:

  • 是的,我也可以避免#pragma pack 的填充,顺便说一句谢谢:-)
【解决方案2】:

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

所有实例变量都在堆栈上分配(尽管标准中没有指定它们是如何分配的,但所有编译器都是这样做的)。原因是,当你递归调用一个函数时,它会为更多变量获得一个新的堆栈帧。这样,如果堆栈上有一个变量“me”,并且从 main() 中调用 main(),那么最终会在第二个堆栈帧中得到第二个“me”变量。当第二个“main()”返回时,堆栈帧被释放以供其他未来调用。

【讨论】:

  • 提醒:变量不需要位于堆栈上。对堆栈没有要求。
  • 同意。 (a) 标准中没有规定,(b) 编译器优化可以把它去掉或者放到别处
猜你喜欢
  • 2014-12-18
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多