是否应该使用继承来减少内存消耗的实例的内存分配?
Memory allocation of instances of should inheritance be used to reduce memory consumption?
分配给类实例的内存是否完全不依赖于初始化的成员变量?如果实例不使用这些变量,我是否会通过创建一个具有较少变量的新类来节省内存?
例如:
class Animal{
public:
int NumberOfFeet;
int AverageWeight;
};
class Dogs - public Animal {
public:
char Breed;
};
int main(){
Animal Snake1;
};
我是否会通过如上所述使用两个类来节省内存,而不是拥有一个具有所有三个不同属性的类?
#include <iostream>
using namespace std;
class Animal{
public:
int NumberOfFeet;
int AverageWeight;
};
class Dogs : public Animal {
public:
char Breed;
};
class Combo{
int NumberOfFeet;
int AverageWeight;
char Breed;
};
int main(){
Combo combo1;
Animal Snake1;
Dogs dog1;
cout << "Size of combo1: " << sizeof (combo1) << endl;//Size of combo1: 12
cout << "Size of Snake1: " << sizeof (Snake1) << endl;//Size of Snake1: 8
cout <<"Size of dog1: " << sizeof (dog1) << endl;//Size of dog1: 12
};
事实证明,在这种情况下,在我的 Xcode IDE 中,一个具有所有三个不同属性的类占用的内存更少。
虽然它可能根据不同的操作系统和不同的对齐设置显示不同的大小值。
根据我所知道的,每个对象都应该有一个大小,即使它属于一个空类,原因是每个对象都应该在内存中有一个地址,以便以后可以检索。如果您对此表示怀疑,只需编写代码进行测试即可。
类只是一个包装器,类的大小等于其所有成员的共同大小之和。一个例外是空类的大小不应为零。
对于您的问题:
分配给类实例的内存是否根本没有 取决于初始化哪些成员变量?如果实例不使用这些变量,我是否会通过创建一个具有较少变量的新类来节省内存?
不,编译器不会知道您是否使用这些变量。如果您不使用它们,它只是一个垃圾值,但它仍然是一个值。
我会通过像上面有两个类来节省内存,而不是 一个类具有所有三个不同的属性?
不,类狗是从类动物继承而来的,因此它将拥有动物所拥有的东西,在这种情况下是NumberOfFeet
和AverageWeight
并且它拥有成员,在这种情况下是Breed
。因此,内存不会仅仅因为您不使用这两个NumberOfFeet
而减少AverageWeight
也就是说,当你的两个类依赖于另一个类(Dog
依赖于Animal
(。如果它们是分开的(没有继承(,答案应该是肯定的(因为Dog
不包含NumberOfFeet
和AverageWeight
(。
编辑:并非总是类的大小等于其成员变量的总和。
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 常量类实例的C++内存地址
- 是否应该使用继承来减少内存消耗的实例的内存分配?
- 在C++中,为什么仅包含与其基类实例的联合的派生类占用的内存多于联合的大小?
- 在函数中实例化的 STL 对象正在占用堆栈或堆上的内存?
- 将内存文件添加到 clang 编译器实例
- 在结构中使用位字段并使用C++从内存中读取实例
- 如何将内存分配给具有数组成员的类的实例
- std::array 模板实例会占用更多的代码内存吗?
- 插入std :: basic_ostream实例化输出时的内存故障
- 构造函数C++中的类实例内存地址
- 基本指针如何能够在派生的类实例中了解基本成员的内存位置
- 有没有办法区分对象实例使用的内存类型
- 如果我声明一个没有名称的类实例,它会保留在内存中吗?
- 当我创建一个int指针并实例化一个数组时,数组在内存中发生了什么
- 派生类的实例化是否为基类的私有成员分配内存
- 分配给 cpp 中定义的全局静态变量的内存是否在 C++ 中删除其类的实例后释放
- 从用户控制的内存池中分配和实例化对象
- C++中参数列表中实例化对象的内存管理
- 静态内存实例中的字符串计数