C++ c+中的结构内存分配+;

C++ c+中的结构内存分配+;,c++,c,memory,structure,instance,C++,C,Memory,Structure,Instance,正如我们所知,结构的内存是在定义其变量(或创建实例)时分配的 现在 分配给结构实例的内存是连续块(如数组)还是离散内存块?如果是,那么原因是什么?结构在堆栈上分配,在一个连续的内存块中(在这种情况下可能是64位)。它是在调用函数时分配的(除非编译器做了一些棘手的事情) 所有实例变量都是在堆栈上分配的(虽然在标准中没有指定它们的分配方式,但所有编译器都是这样做的)。原因是,当您递归调用一个函数时,它将为更多变量获得一个新的堆栈框架。这样,如果堆栈上有一个变量“me”,并且从main()中调用mai

正如我们所知,结构的内存是在定义其变量(或创建实例)时分配的

现在


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

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


所有实例变量都是在堆栈上分配的(虽然在标准中没有指定它们的分配方式,但所有编译器都是这样做的)。原因是,当您递归调用一个函数时,它将为更多变量获得一个新的堆栈框架。这样,如果堆栈上有一个变量“me”,并且从main()中调用main(),那么在第二个堆栈帧中就会有第二个“me”变量。当第二个“main()”返回时,堆栈帧将被释放,以便将来进行其他调用。

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


所有实例变量都是在堆栈上分配的(虽然在标准中没有指定它们的分配方式,但所有编译器都是这样做的)。原因是,当您递归调用一个函数时,它将为更多变量获得一个新的堆栈框架。这样,如果堆栈上有一个变量“me”,并且从main()中调用main(),那么在第二个堆栈帧中就会有第二个“me”变量。当第二个“main()”返回时,堆栈帧将被释放,以便将来进行其他调用。

为结构分配的内存是连续的。从C11标准草案中:

结构类型描述按顺序分配的非空数据集 成员对象

但是,根据以下情况,为
结构
分配的存储中可能存在填充:

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

以及,来自:

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


结构
分配的内存是连续的。从C11标准草案中:

结构类型描述按顺序分配的非空数据集 成员对象

但是,根据以下情况,为
结构
分配的存储中可能存在填充:

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

以及,来自:

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


是的,但请记住有填充(并不总是)。在一个结构中,您可以保证的是,成员将按照声明的顺序分配。编译器可以插入“padding”字节,作为对齐的示例。@ThomasMatthews--还可以保证结构的开头不会有填充。。是的,但请记住有填充(不总是)。在一个结构中,您可以保证的是,成员将按照声明的顺序进行分配。编译器可以插入“padding”字节,作为对齐的示例。@ThomasMatthews--还可以保证在
结构
的开头没有填充。提醒:不要求变量位于堆栈上。没有对堆栈的要求。已同意。(a) 标准中没有指定它,(b)编译器优化可以删除它或将它放在其他位置提醒:不要求变量位于堆栈上。没有对堆栈的要求。已同意。(a) 它没有在标准中指定,(b)编译器优化可以删除它或将它放在其他地方是的,我也可以通过#pragma pack避免填充,顺便说一句谢谢:-)是的,我也可以通过#pragma pack避免填充,顺便说一句谢谢:-)
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;
}