如何减小对象的大小 我用Visual C++编写了一个应用程序。我编写了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对象的单个实例使用的精确大小:

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
        ,如果可能,等等)
      • 共享
        静态
        数据成员(如果可能)
      一,。如果可能的话,将成员函数更改为静态成员函数,因为每个成员函数将占用CMyObject实例中的一些空格

      完全不正确。成员函数不存储在对象中。一点也不

      二,。如果可能,将虚拟成员函数更改为成员函数,因为虚拟成员函数可能占用更多空间

      如果删除继承树中的所有虚拟成员函数,将阻止生成vtable指针。那会帮你节省一些字节,当然

      三,。消除不必要的成员变量以减少空间

      是的,如果它们是不必要的,它们无论如何都应该被移除

      四,。CMyObject从类到只包含一些成员变量的结构,因此将消除为类的构造函数和析构函数分配的空间

      再说一遍,没有;即使结构在这方面与类不同(它们没有),函数仍然不存储在对象中。函数是代码,