记忆由功能占用

时间:2010-12-09 21:34:54

标签: c++ visual-studio-2008

我有一个Voxel类正在创建五十万次。我减少了我正在使用的数据量,但我发现我不确定函数是否以与变量类似的方式占用内存。如何找出函数在程序中占用的空间量?更重要的是,当我有500个类的实例时,这是否意味着我有500个函数实例?

我猜这很可能不是这种情况(不考虑内联函数),但解释会很好。

4 个答案:

答案 0 :(得分:4)

不要惊慌。大多数函数的代码(无论是否为inline)仅在链接二进制文件中出现一次。

模板方法每次实例化一次,因为不同的模板参数会导致不同的代码。

在此上下文中,instantiation表示在使用一组特定模板参数构建类或函数模板时使用。每个不同的参数集都会产生一个新的实例化,但对于类模板,只有实际用于每个实例化的成员函数才会包含在最终的二进制图像中。更多背景here

对于Visual Studio,请确保启用link-time code generation,因为这可以通过检查链接时的完整功能集以及您应该已经拥有的常规compile-time optimizations来进一步减少代码大小出。您还可以在链接时使用/OPT:REF来省略未引用的功能。这是Release版本的默认值,但值得仔细检查。

答案 1 :(得分:3)

不,每个模板迭代只有一个函数实例。类的所有对象都引用相同的函数实例。

确定函数的代码大小并非易事。生成链接图是确定函数大小的最常用方法,但需要一些教育才能阅读。

答案 2 :(得分:2)

除非你在该类中有虚函数 - 否,成员函数不会在类实例中占用任何空间。使用虚函数,每个实例都有一个指向虚函数表的指针。

答案 3 :(得分:1)

创建新对象时占用空间的是对象数据,而不是对该数据的操作的机器代码 - 如果您愿意,可以将成员函数视为“普通”,隐式传递的自由函数一个this指针。

例如,从codegen的角度来看,

之间几乎没有区别
struct A { int x; void foo(); };

struct A {};
void foo( A* self );

对于虚函数,这并不完全正确,因为每个虚函数都会添加一个指向vtable的指针,但这是一个不同的故事。