什么在c ++中使用更多内存? 2个或2个函数?

时间:2014-06-30 20:45:44

标签: c++ class memory memory-management methods

我正在使用c ++编写Nintendo DS(内存为4MB)。我有一个按钮类,存储x,y位置和长度等数据。以下哪项会占用更少的内存?

方法1 ,类变量length,x,y和halfPoint

Button::Button(int setX, int setY, int setLength)
{
    x = setX;
    y = setY;
    length = setLength;
    halfPoint = length/2;
}
//access variable with buttonName.halfPoint

方法2 ,类变量length,x和y

Button::Button(int setX, int setY, int length)
{
    x = setX;
    y = setY;
    length = setLength;
}

int Button::getHalfPoint()
{
    return length/2;
}
//access variable with buttonName.getHalfPoint()

感谢任何帮助。 (在实际代码中,我计算的位置比半点复杂得多)

3 个答案:

答案 0 :(得分:2)

如果getHalfPoint()有很多,Button方法占用的空间会减少。为什么?因为成员函数实际上只是由编译器实现为常规函数,并且具有指向对象的指针的隐含的第一个参数。因此编译器将您的函数重写为:

int getHalfPoint(Button* this)
{
    return this->length/2;
}

(由于名称损坏,这有点复杂,但这可以解释。)

但是,您应该仔细考虑必须进行的额外计算量,以避免存储4个额外字节。正如Cameron所提到的,编译器可能会为对象添加额外的空间,具体取决于体系结构(我认为RISC体系结构可能会发生这种情况)。

答案 1 :(得分:2)

嗯,这取决于!

方法代码在内存中只存在一次,但每个对象实例都存在一次成员变量。

因此,您必须计算您创建的实例数(乘以sizeof变量),并将其与编译方法的大小进行比较(使用像objdump这样的工具)。

您还希望比较Button的大小与是否包含额外变量,因为编译器完全有可能将其填充到相同的长度。

答案 2 :(得分:1)

我建议您在班级中声明getHalfPoint方法。这将使编译器内联代码。

函数中的代码有可能是一个汇编指令,并且根据您的平台,取4个字节或更少的大小。在这种情况下,让变量代表另一个变量的一半可能没有任何好处。研究“正确转变”。另外,要充分利用变量unsigned int。 (未定义右移有符号整数。)

内联功能意味着只要有函数调用,就会粘贴函数的内容。这减少了函数调用的开销(例如分支指令,推送和弹出参数)。减少分支指令可能甚至加速程序,因为没有刷新指令缓存或管道。