我正在使用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()
感谢任何帮助。 (在实际代码中,我计算的位置比半点复杂得多)
答案 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
。 (未定义右移有符号整数。)
内联功能意味着只要有函数调用,就会粘贴函数的内容。这减少了函数调用的开销(例如分支指令,推送和弹出参数)。减少分支指令可能甚至加速程序,因为没有刷新指令缓存或管道。