【问题标题】:How is memory allocated to struct in C++? Is it dynamic or static memory allocation?C++中的struct是如何分配内存的?是动态内存分配还是静态内存分配?
【发布时间】:2018-03-14 07:42:06
【问题描述】:

我对 C++ 编程很陌生。所以我只想知道结构的内存分配是静态的还是动态的?这是我基本拥有的代码。

struct student {
    double average;
    struct subjects sub[course_numbers];
};

struct subjects {
    char name;
   int crn;
   int credits;
};

【问题讨论】:

  • 是的,它可能是这两者之一。
  • 提问有问题吗?因为我看到很多人只是投反对票。 @MatsPetersson 是哪一个?
  • @Jazlyn 这完全取决于你。您可以在堆栈上分配结构(例如静态变量)或在堆上分配它(例如使用 new)
  • 也可以。在您的示例中,这取决于您如何使用结构,而不是结构本身。
  • 您也可以在自动内存(全局或文件全局)或常量内存(只读段)中分配结构。一切都取决于您声明实例的方式和位置。

标签: c++ memory struct dynamic-memory-allocation static-memory-allocation


【解决方案1】:

您发布的代码只是数据对象“学生”和“主题”的定义。它只是代码,既不存在于堆栈也不存在于堆中,直到您将其投入使用并从中生成实际类型。这是一个用它做某事的代码示例:

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

【讨论】:

  • 我有一个 C 代码,我应该将它与所有动态分配一起转换为 C++ 到静态分配。结构 myStruct* 整数; ints = (struct myStruct *) malloc (sizeof(struct myStruct) * numbe_Ints) ;我主要有这段代码,所有结构都在头文件中定义,它们在 cpp 文件中实现。
  • 谢谢你,你所做的很有意义。我得到了大部分。但是,如何在不使用 new 运算符的情况下为结构指定大小。
  • 在 C 中,需要 sizeof() 来保留堆内存中的空间。在 C++ 中,“new”会自动执行此操作。另一方面,如果您在没有 new 或 malloc 的情况下进行实例化,而是将其放在堆栈上,编译器将确保程序(当它运行时)为结构的大小保留所需的内存量。底线:您不必指定大小。
【解决方案2】:

内存区域比stackheap多,还有自动存储和常量存储。您的实例所在的内存取决于您定义实例的方式和位置。

在函数外部声明实例会将实例置于自动存储中。这是声明全局变量和文件全局变量的地方:

My_Struct instance;
// or:
static My_Struct instance;

在函数中将变量声明为非静态,可以将实例放在堆栈上(假设实现使用了一个):

void Any_Function()
{
  My_Struct instance;
}

同样,编译器可以使用引用或其他方式(处理器缓存)来表示结构,因此您的实例可能不在堆栈中。

使用new 进行分配将实例放入动态内存(也称为堆):

void Another_Function()
{
  My_Struct * p_instance = new My_Struct;
  // ...
  delete p_instance;
}

您还可以将实例放入 constant 内存中,或放置所有常量文字的内存中:

const My_Struct instance = {/*...*/};

您还可以通过在函数内将实例声明为static 将实例放入“全局”内存中:

void Yet_Another_Function()
{
  static My_Struct instance;
}

所以,回答您的问题:根据声明实例的方式和位置,将结构放入内存中。内存区域比staticdynamic 多。 static 有多种定义,因此您必须澄清一下。通常,dynamic 表示在运行时。 static 实例可能是指在编译/构建过程中分配的实例。

【讨论】:

  • 就我而言,我有一个动态结构。谢谢你的帮助:)
猜你喜欢
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2011-08-31
  • 1970-01-01
  • 2012-01-13
  • 2015-05-02
相关资源
最近更新 更多