每当我们从一个类创建一个对象时,它就会在一个占用更多空间的堆上创建,而一个struct变量在堆栈上占用它的内存。如果我创建一个Person类和一个具有相同属性的struct P,那么它应该证明我刚才所说的。请检查以下2个代码片段:
#include <iostream.h>
#include <conio.h>
#include <string>
using namespace std;
class Person{
int age;
string hair_color;
float height;
public:
Person::Person(int n)
{
age = n;
}
int Person::getAge()
{
return age;
}
};
struct P{
int age;
};
main()
{
Person person(45);
//Person *person = new Person(45);
P myPerson;
cout<<sizeof(person)<<endl;
cout<<sizeof(myPerson)<<endl;
//cout<<"Age: "<<person->getAge();
getch();
}
当我写这段代码时:
#include <iostream.h>
#include <conio.h>
#include <string>
using namespace std;
class Person{
int age;
string hair_color;
float height;
public:
Person::Person(int n)
{
age = n;
}
int Person::getAge()
{
return age;
}
};
struct P{
int age;
};
main()
{
// Person person(45);
Person *person = new Person(45);
P myPerson;
cout<<sizeof(person)<<endl;
cout<<sizeof(myPerson)<<endl;
getch();
}
如果我在这里对象和参考错误,请纠正我。我想从我的代码中知道占用更多空间的东西:Object还是Struct?
答案 0 :(得分:5)
在某些语言(C#)中,struct
用于定义可以堆栈分配的类型,而class
实例必须在堆上分配。
在C++
中,没有这样的差异,并且由实例化器决定是在堆还是堆栈上分配对象。例如
Person* person = new Person(45);
在堆上分配Person
实例,而
Person person(45);
在堆栈上分配类似的实例。
此外,通常没有什么能支持“在堆上创建的占用更多空间的语句与在堆栈上占用其内存的结构变量”。通常情况下,堆分配带来一些开销(内存和处理时间),但堆栈空间通常更加有限(通常每个线程的堆栈大小固定)。
有很多文档说明何时使用什么,甚至dicussions here on SO。简而言之,堆栈将用于小型,短期对象(函数范围内的临时对象或类似对象)。
答案 1 :(得分:5)
在C ++中,struct
和class
关于它们如何分配以及它们占用多少空间完全相同 - 主要区别在于{{1}的默认值数据是私有的,您需要为要向类外部公开的任何成员组添加class
,其中public:
默认具有公共成员,如果如果您想拥有私人会员,则需要添加struct
。
是否在堆,堆栈或全局内存中分配了某些内容完全取决于如何编写使用类/结构的代码(例如,调用private:
将在堆栈上分配,而不是调用new will如果对象是new
或struct
,那么它就会分配全局空间或者在堆栈上完全没有区别 - 如果它们具有相同的内容,它们会占用相同的大小。
当结构中的数据是“纯数据”并且没有构造函数或成员函数时,使用class
的约定是OFTEN,其中当存在成员函数时使用struct
/或涉及的构造函数。然而,这是一个惯例,并且在:
class
和
struct Coord3D
{
float x, y, z;
};
或之间
class Coord3D
{
public:
float x, y, z;
};
和
struct Person
{
private:
int age;
std::string name;
public:
int getAge() { return age; }
std::string getName() { return name; }
};
(编译使用两种替代形式之一的代码,从生成的二进制代码中判断它是第一个还是第二个代码是完全不可能的)
答案 2 :(得分:1)
请记住,在C ++中,结构和类不是不同类型的东西。它们是相同的东西,struct
是语法糖,用于创建具有公共成员和方法的class
,并默认为公共继承。
具体做法是:
“C ++编程语言”一书的第10.2.8节,Bjarne Stroustrup声明:
根据定义,struct是一个成员公开的类 默认;
struct s { ...
只是
的简写class s { public:...
C++ Standard州(第11.2节,第2项):
如果没有基类的访问权限,
public
就是 假定派生类声明为struct
且private
为时 在声明类class
时假设。
答案 3 :(得分:1)
除了其他答案之外,struct
和class
是模板,告诉编译器 如何组织。 struct
和class
不占用可执行文件中的任何空间,因为它们仅在编译期间使用。
对象通常被称为class
或struct
的实例。该对象占用内存。占用的内存量取决于它实例化的struct
或class
的定义。
因此,在回答问题的标题Which occupies more space: Object or Struct?
时,对象会执行,因为struct
只是一个模板而对象是实例化。