(C++)寻找减少内存使用量的技巧

use*_*345 5 c++ memory-management

我有一个非常严格和严格的内存限制的问题.我是CPP的极客,我想减少我的内存使用量.请给我一些提示.


我的一个朋友建议在我的结构中使用函数.例如,而不是使用:

struct node{
   int f()
   {}
}
Run Code Online (Sandbox Code Playgroud)

他建议我用:

int f(node x)
{}
Run Code Online (Sandbox Code Playgroud)

这真的有帮助吗?

注意:我的结构有很多副本.


这里有更多信息:

我正在编写某种段树来解决在线评判中的练习问题.我在结构中获得树节点.我的struct有以下变量:

  int start;
  int end;
  bool flag;
  node* left;
  node* right;
Run Code Online (Sandbox Code Playgroud)

内存限制为16 MB,我使用的是16.38 MB.

Mar*_*som 21

我猜你的问题的潜台词,你的大部分内存使用是数据,而不是代码.以下是一些提示:

  • 如果您的数据范围有限,请充分利用它.如果整数的范围是-128到127,则使用char而不是int,或者unsigned char如果它是0到255.同样使用int16_tuint16_t用于-32768..32767和0..65535的范围.
  • 重新排列结构元素,使较大的项目首先出现,这样数据对齐不会在结构的中间留下死区.您通常也可以通过编译器选项控制填充,但最好只是首先使布局最佳.
  • 使用没有大量开销的容器.例如,使用vector而不是代替list.使用boost::ptr_vector而不是std::vector包含shared_ptr.
  • 避免虚拟方法.添加到结构或类的第一个虚方法会向vtable添加一个隐藏指针.


Mar*_*all 9

不,常规成员函数不会使类或结构更大.引入函数可能(在许多平台上)添加一个vtable指向该类的指针.在x86上会增加四个字节的大小.但是,添加虚函数时不再需要内存 - 一个指针就足够了.类或结构类型的大小永远不为零(无论它是否具有任何成员变量或虚函数).这是为了确保每个实例占用自己的内存空间(源代码,第9.0.3节).


小智 5

在我看来,减少内存的最佳方法是考虑算法空间的复杂性,而不是仅仅进行精细的代码优化.重新考虑诸如动态编程表,不必要的副本之类的东西,通常是任何在内存效率方面都有疑问的东西.此外,尝试在不再需要时尽早释放内存资源.