我使用Visual C ++编写应用程序。我编写CMyObject类并且可能会分配很多CMyObject对象的实例,所以我想减小CMyObject类的大小。
我能想到的是:
首先,我可以使用以下代码来获取单个CMyObject对象实例所使用的准确大小:
CMyObject Object;
// Get the size of memory allocated for CMyObject object
int nSize = sizeof(Object);
是正确的吗?
其次,为了减小CMyObject的大小,我有几个想法:
(1)如果可能的话,将成员函数更改为静态成员函数,因为每个成员函数将在CMyObject的实例中占用一些空格。
(2)如果可能,将虚拟成员函数更改为成员函数,因为虚拟成员函数可能占用更多空格。
(3)消除不必要的成员变量以减少空间。
(4)最后,如果(1),(2)和(3)不能正常工作,那么将CMyObject从类更改为只包含一些成员变量的结构,从而将消除为构造函数和析构函数分配的空间一个班级。
我的想法是否正确?
由于
答案 0 :(得分:4)
1。如果可能的话,将成员函数更改为静态成员函数,因为每个成员函数将在CMyObject的实例中占用一些空格。
完全错误。成员函数不存储在对象中。完全没有。
2。如果可能,将虚拟成员函数更改为成员函数,因为虚拟成员函数可能占用更多空格。
如果在继承树中删除所有虚拟成员函数,则会阻止生成vtable指针。那肯定会为你节省几个字节。
3。消除不必要的成员变量以减少空间。
是的,如果没有必要,他们应该被删除。
4。 CMyObject从类到只包含一些成员变量的结构,因此将消除为类的构造函数和析构函数分配的空间。
再次,不;即使结构在这方面与类不同(它们没有),函数仍然不存储在对象中。功能是代码,而不是数据。
答案 1 :(得分:3)
(1)和(2)不是有效选项。非virtual
方法不占用每个对象的空间,virtual
方法不会在继承层次结构中定义的第一个方法之外添加任何开销。
(3)显然是有效的。
(4),再次,无效。 class
和struct
之间没有区别,除了默认访问级别。
其他一些有效的建议:
pragma pack
)。您可能在成员之间有填充字节,这可能会给您带来一些开销。 short
代替int
,如果可能,等等。)static
个数据成员答案 2 :(得分:2)
sizeof
是正确的。从技术上讲,它返回std::size_t
,而不是int
,但如果您的对象大于INT_MAX
,那么您可能已经知道它了。
3是正确的。
1不正确。没有现有的C ++实现,其中成员函数占用对象中的空间。
2非常正确。如果您的类(包括所有基类)根本没有虚拟成员,那么您将大致保存每个对象的指针大小。因此摆脱最后一个节省了空间,其他人则没有。
4不正确,构造函数和析构函数在这方面与任何其他成员函数相同。
除了3之外,您还可以尝试以不同的顺序布置数据成员。一般的想法是找出在你的班级中出现填充的地方,并重新安排成员以减少它。第一个经验法则是按照从具有最大对齐要求的那个到最小对齐的顺序对它们进行排序,尽管这是依赖于实现的,并且无论如何这不是最小化填充的唯一方法。当然,这会改变构造和销毁成员的顺序,因此可能不适合您的班级。
答案 3 :(得分:0)
只有3个是正确的。
您也可以更改变量类型。例如,您可以将 int 更改为 char ,如果变量< 255。