我对 C++ 编程很陌生。所以我只想知道结构的内存分配是静态的还是动态的?这是我基本上拥有的代码。
struct student {
double average;
struct subjects sub[course_numbers];
};
struct subjects {
char name;
int crn;
int credits;
};
我对 C++ 编程很陌生。所以我只想知道结构的内存分配是静态的还是动态的?这是我基本上拥有的代码。
struct student {
double average;
struct subjects sub[course_numbers];
};
struct subjects {
char name;
int crn;
int credits;
};
内存区域比堆栈或堆多,还有自动存储和常量存储。您的实例所在的内存取决于您定义实例的方式和位置。
在函数外部声明实例会将实例置于自动存储中。这是声明全局和文件全局变量的地方:
My_Struct instance;
// or:
static My_Struct instance;
在函数内将变量声明为非静态,可以将实例放在堆栈上(假设实现使用一个):
void Any_Function()
{
My_Struct instance;
}
同样,允许编译器使用引用或其他方式(处理器缓存)来表示结构,因此您的实例可能不在堆栈中。
分配 usingnew
将实例放入动态内存(又名堆):
void Another_Function()
{
My_Struct * p_instance = new My_Struct;
// ...
delete p_instance;
}
您还可以将实例放入常量内存或放置所有常量文字的内存中:
const My_Struct instance = {/*...*/};
您还可以通过将实例声明为static
函数内部来将实例放入“全局”内存中:
void Yet_Another_Function()
{
static My_Struct instance;
}
因此,回答您的问题:根据声明实例的方式和位置,将结构放入内存中。内存区域多于static
或dynamic
。有多种定义static
,所以你必须澄清一下。通常,dynamic
意味着在运行时。静态实例可以指在编译/构建过程中分配的实例 。
您发布的代码只是数据对象“学生”和“主题”的定义。它只是代码,既不存在于堆栈也不存在于堆中,直到您将其投入使用并从中生成实际类型。这是一个用它做某事的代码示例:
//define the struct
struct myStruct
{
int myInt;
};
// use it
int main(void)
{
myStruct oStruct{456}; //put on stack, automatically cleaned up at end of main function.
myStruct* pStruct = new myStruct{654}; //put on heap, must be cleaned up manually.
delete pStruct; //because you put on heap, clean it up afterwards.
pStruct = nullptr;
return 0;
}