什么占用更多空间:对象或结构
What occupies more space: Object or Struct?
每当我们从类创建一个对象时,它都是在堆上创建的,与在堆栈上占用内存的结构变量相比,它占用了更多的空间。如果我创建一个具有相同属性的 Person 类和一个结构 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();
}
如果我在这里对对象和引用有误,请纠正我。我想从我的代码中知道什么占用更多空间:对象还是结构?
在某些语言 (C#) 中,struct
用于定义可以堆栈分配的类型,而必须在堆上分配class
实例。
在C++
中,没有这样的区别,由实例化器决定是在堆上还是在堆栈上分配对象。例如
Person* person = new Person(45);
在堆上分配Person
实例,而
Person person(45);
在堆栈上分配类似的实例。
此外,通常没有什么可以支持"在堆上创建,与占用堆栈内存的结构变量相比,占用更多空间"的说法。堆分配通常会带来一些开销(内存和处理时间),但堆栈空间通常要有限得多(通常是每个线程的固定堆栈大小)。
有很多关于何时使用什么的文档,甚至关于 SO 的分类。简而言之,堆栈将用于小型、生存期较短的对象(函数范围内的临时对象或类似对象)。
在C++中,struct
和class
在如何分配和占用多少空间方面完全相同 - 主要区别在于class
的默认值是数据是私有的,您需要为要向类外部公开的任何成员组添加public:
, 其中struct
默认具有公共成员,如果要拥有私有成员,则需要添加private:
。
无论是在堆、堆栈还是全局内存中分配某些内容完全取决于使用类/结构的代码是如何编写的(例如,调用 new
将在堆栈上分配,不调用 new 将分配全局空间或堆栈),如果对象是struct
或class
,则绝对没有区别 - 如果它们具有相同的内容。
当结构中的数据是"纯数据"并且没有构造函数或成员函数时,通常使用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; }
};
和
class Person
{
// no need to have private:, but most people add it just to be perfectly clear
int age;
std::string name;
public:
int getAge() { return age; }
std::string getName() { return name; }
};
(编译使用两种替代形式之一的代码,并且完全不可能从生成的二进制代码中分辨它是第一个还是第二个)
除了其他答案之外,struct
和class
是模板,告诉编译器某些东西是如何组织的。 struct
和class
不会占用可执行文件中的任何空间,因为它们仅在编译期间使用。
对象通常称为class
或struct
的实例。 对象占用内存。 占用的内存量取决于实例化它的struct
或class
的定义。
因此,在回答您的问题标题时,Which occupies more space: Object or Struct?
,对象确实如此,因为struct
只是一个模板,而对象是实例化。
,在C++中,结构体和类不是不同类型的东西。它们是一回事,struct
是语法糖,用于创建具有公共成员和方法的class
,并默认为公共继承。
具体说来:
Bjarne Stroustrup在"C++编程语言"一书的第10.2.8节中指出:
根据定义,结构是一个类,其中成员是公共的 违约;那是
struct s { ...
只是简写
class s { public:...
C++标准规定(第 11.2 节,第 2 项):
在没有基类的访问说明符的情况下,
public
当派生类声明为struct
并且private
当类声明为class
时假定。
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 具有引用成员的结构是否具有唯一的对象表示形式
- 为什么我们再次从结构对象创建结构变量?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- C++:对象将 lambda 存储到结构中,稍后调用该函数
- 如何在C++中表示JSON文档的递归对象结构?
- 哪些值存储在对齐的结构/类对象的填充字节中
- 结构对象的指针成员在传递给函数时被修改
- C++ 提升 - 包含类层次结构对象的类的序列化
- 在 c++ 中使用字符串变量选择静态类结构,而不带对象
- 如何通过不同的指针使用类的对象访问结构?(链表)(C++)
- 是否可以在C++ (C) 中使用全局范围对象(结构)?
- 将数组/对象/结构列表从C#库中传递给C MFC应用程序
- 如何使用方法返回指向对象结构的指针?
- 对象/结构等的C++内存布局是什么?
- 这些不同的对象结构之间有什么区别
- 如何找到C++可执行文件的所有对象(类对象/结构)
- C/C++ 中的对象/结构对齐
- 额外的继承对对象结构或实例化有影响吗?
- 尝试处理嵌套对象/结构和动态数组时出现内存泄漏或内存错误。可能的 Xcode/malloc 问题