class(包括结构变量和动态变量)存储在哪里?
Where is the class (including struct and dynamic variables) stored?
假设我有以下 class:
class message
{
private:
HeaderType header;
// Message text
byte * text;
public:
message(int ID,struct in_addr senderIP);
~message();
HeaderType getHeader();
byte * getText();
};
其中 HeaderType 是一个结构,如下所示:
typedef struct {
int mID;
struct in_addr mIP;
}HeaderType;
class(包括结构和动态变量)存储在哪里(堆栈、堆...)?
P.S。我将 message m
声明为静态变量。
classes are stored in stack, while structs are allocated in free store
这根本不正确。它们是一回事,只是 struct
成员默认为 public
,而 class
成员默认为 private
。
分配内存的位置完全取决于您实例化对象。
Foo a; // instantiated on the stack
Foo b* = new Foo; // on the heap
上面的 Foo
是 struct
还是 class
都没有关系,它们的行为方式相同。
在您的示例中,成员 byte* text;
将与您的 class 一起分配。更明确地说,如果你在栈上实例化一个message
,text
将被分配到栈上;如果你在堆上实例化一个message
,text
将分配在堆上。
话虽如此,被指向对象的位置不必与指针位于同一位置。例如
int* x; // This is a pointer declared on the stack
int a = 5; // This is an int declared on the stack
int* b = new int(5); // This is an int declared on the heap
x = &a; // pointing to a stack object
x = b; // pointing to a heap object
x = nullptr; // pointing to nothing!
所以你可以看到实际指针的内存和被指向的对象的内存是无关的。事实上,在最后一行中,指针被实例化,但指向 nullptr
.
针对您更正的问题:
message
的静态实例将位于数据段。每个非指针成员(包括 HeaderType
的成员)的内存在编译时保留。在程序开始时将调用 message
和 HeaderType
的构造函数,这将初始化此内存。
如果 message
的构造将为 byte* text
分配内存,则此内存将位于堆中。
假设我有以下 class:
class message
{
private:
HeaderType header;
// Message text
byte * text;
public:
message(int ID,struct in_addr senderIP);
~message();
HeaderType getHeader();
byte * getText();
};
其中 HeaderType 是一个结构,如下所示:
typedef struct {
int mID;
struct in_addr mIP;
}HeaderType;
class(包括结构和动态变量)存储在哪里(堆栈、堆...)?
P.S。我将 message m
声明为静态变量。
classes are stored in stack, while structs are allocated in free store
这根本不正确。它们是一回事,只是 struct
成员默认为 public
,而 class
成员默认为 private
。
分配内存的位置完全取决于您实例化对象。
Foo a; // instantiated on the stack
Foo b* = new Foo; // on the heap
上面的 Foo
是 struct
还是 class
都没有关系,它们的行为方式相同。
在您的示例中,成员 byte* text;
将与您的 class 一起分配。更明确地说,如果你在栈上实例化一个message
,text
将被分配到栈上;如果你在堆上实例化一个message
,text
将分配在堆上。
话虽如此,被指向对象的位置不必与指针位于同一位置。例如
int* x; // This is a pointer declared on the stack
int a = 5; // This is an int declared on the stack
int* b = new int(5); // This is an int declared on the heap
x = &a; // pointing to a stack object
x = b; // pointing to a heap object
x = nullptr; // pointing to nothing!
所以你可以看到实际指针的内存和被指向的对象的内存是无关的。事实上,在最后一行中,指针被实例化,但指向 nullptr
.
针对您更正的问题:
message
的静态实例将位于数据段。每个非指针成员(包括 HeaderType
的成员)的内存在编译时保留。在程序开始时将调用 message
和 HeaderType
的构造函数,这将初始化此内存。
如果 message
的构造将为 byte* text
分配内存,则此内存将位于堆中。