如何减小对象的大小 我用Visual C++编写了一个应用程序。我编写了CMyObject类,可能会分配很多CMyObject的实例,所以我想减小CMyObject类的大小
我能想出的办法是: 首先,我可以使用以下代码获得CMyObject对象的单个实例使用的精确大小:如何减小对象的大小 我用Visual C++编写了一个应用程序。我编写了CMyObject类,可能会分配很多CMyObject的实例,所以我想减小CMyObject类的大小,c++,variables,size,C++,Variables,Size,我能想出的办法是: 首先,我可以使用以下代码获得CMyObject对象的单个实例使用的精确大小: CMyObject Object; // Get the size of memory allocated for CMyObject object int nSize = sizeof(Object); 对吗 第二,为了减小CMyObject的大小,我有几个想法: (1) 如果可能的话,将成员函数更改为静态成员函数,因为每个成员函数将占用CMyObject实例中的一些空格 (2) 如果可能,
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从类更改为只包含一些成员变量的结构,从而消除为类的构造函数和析构函数分配的空间
我的想法正确吗
谢谢
sizeof
是正确的。从技术上讲,它返回的是std::size\u t
,而不是int
,但是如果您的对象大于int\u MAX
,那么您可能已经知道了
3是正确的
1不正确。没有现有的C++实现,成员函数占用对象中的空间。
2是非常稍微正确的。如果您的类(包括所有基类)根本没有虚拟成员,那么您将为每个对象保存大约一个指针的大小。因此,去掉最后一个可以节省空间,其他的则不行
4不正确,构造函数和析构函数在这方面与任何其他成员函数相同
与3一样,您可以尝试以不同的顺序排列数据成员。总的想法是计算出填充将在您的类中发生的位置,并重新安排成员以减少填充。第一条经验法则是按顺序对它们进行排序,从具有最大对齐要求的一个排序到最小对齐要求的排序,尽管这取决于实现,而且无论如何,这不是最小化填充的唯一方法。当然,这会改变成员的构造和销毁顺序,因此可能不适合您的类。
sizeof
是正确的。从技术上讲,它返回的是std::size\u t
,而不是int
,但是如果您的对象大于int\u MAX
,那么您可能已经知道了
3是正确的
1不正确。没有现有的C++实现,成员函数占用对象中的空间。
2是非常稍微正确的。如果您的类(包括所有基类)根本没有虚拟成员,那么您将为每个对象保存大约一个指针的大小。因此,去掉最后一个可以节省空间,其他的则不行
4不正确,构造函数和析构函数在这方面与任何其他成员函数相同
与3一样,您可以尝试以不同的顺序排列数据成员。总的想法是计算出填充将在您的类中发生的位置,并重新安排成员以减少填充。第一条经验法则是按顺序对它们进行排序,从具有最大对齐要求的一个排序到最小对齐要求的排序,尽管这取决于实现,而且无论如何,这不是最小化填充的唯一方法。当然,这会更改成员的构造和销毁顺序,因此可能不适合您的类。(1)和(2)不是有效选项。非virtual
方法不占用每个对象的空间,virtual
方法不增加继承层次结构中定义的第一个方法之外的开销
(3) 这显然是正确的
(4) ,同样无效。除了默认的访问级别,class
和struct
之间没有区别
其他一些有效的建议:
- 成员的重新排序(或
)。成员之间可能有填充字节,这可能会给您带来一些开销李>杂注包
- 使用较小的类型(
而不是short
,如果可能,等等)int
- 共享
静态
数据成员(如果可能)
- (1)和(2)不是有效选项。非
virtual
方法不占用每个对象的空间,virtual
方法不增加继承层次结构中定义的第一个方法之外的开销
(3) 这显然是正确的
(4) ,同样无效。除了默认的访问级别,class
和struct
之间没有区别
其他一些有效的建议:
- 成员的重新排序(或
)。成员之间可能有填充字节,这可能会给您带来一些开销李>杂注包
- 使用较小的类型(
而不是short
,如果可能,等等)int
- 共享
静态
数据成员(如果可能)