什么在c+中使用了更多内存+;?2个整数还是2个函数? 我在C++中为任天堂DS编写(带有4MB RAM)。我有一个button类,它存储x、y位置和长度等数据。以下哪项占用的内存更少

什么在c+中使用了更多内存+;?2个整数还是2个函数? 我在C++中为任天堂DS编写(带有4MB RAM)。我有一个button类,它存储x、y位置和长度等数据。以下哪项占用的内存更少,c++,class,memory,memory-management,methods,C++,Class,Memory,Memory Management,Methods,方法1,类变量长度、x、y和半点 Button::Button(int setX, int setY, int setLength) { x = setX; y = setY; length = setLength; halfPoint = length/2; } //access variable with buttonName.halfPoint 方法2,类变量长度,x和y Button::Button(int setX, int setY, int len

方法1,类变量长度、x、y和半点

Button::Button(int setX, int setY, int setLength)
{
    x = setX;
    y = setY;
    length = setLength;
    halfPoint = length/2;
}
//access variable with buttonName.halfPoint
方法2,类变量长度,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()
感谢您的帮助。(在真实代码中,我计算的位置比半点复杂得多)

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

int getHalfPoint(Button* this)
{
    return this->length/2;
}
(由于名称混乱,这有点复杂,但这可以作为解释。)

你应该仔细考虑额外的计算量,以避免存储额外的4字节。正如Cameron提到的,编译器可能会为对象添加额外的空间,这取决于体系结构(我认为RISC体系结构可能会出现这种情况)。

好吧,这取决于

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

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


您还需要比较带和不带额外变量的
按钮的大小,因为编译器完全有可能将其填充到相同的长度。

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

函数中的代码可能是一条汇编指令,根据您的平台,其大小为4字节或更小。在这种情况下,让一个变量代表另一个变量的一半可能没有好处。研究“右移”。另外,为了充分利用这一点,将变量
设为unsigned int
。(未定义有符号整数的右移。)


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

天真地(不考虑优化),数据成员在该类的每个实例中占用一定数量的字节(对于
int
,可能是四个字节),当一个函数为整个程序占用一定数量的字节时(可能查看汇编输出?)。然而,诸如优化和函数调用开销之类的细节会使这种幼稚的分析崩溃。所以测量!:)一个技巧是,如果您没有修改参数(SetX和SetY),那么应该将它们作为const&(常量引用)传递。这有助于performance@blade:不适用于小型基本类型。这就是所谓的悲观。也许它们只是两种小数据类型,但作为一种良好的实践,这是我通常所做的,根据bjarne stroupous先生的说法,damm他的姓真的很棘手:)@blade看起来你应该读更多的内容。请注意,由于内联和一般优化,它要复杂得多。虽然我们可以计算button类的大小,但每个选项所包含的代码量会因其使用方式、位置和频率以及所选的编译器选项而大不相同。@Deduplicator:说得好。如果您愿意,您可以在中编辑您的评论:-),否则我认为它可以作为评论。另一个有趣的问题是,在这样的内存受限环境中,可以向编译器传递一个标志来优化大小(
Os
),并完全禁用内联。他们提到,他们正在做的事情比除法更复杂。如果是这样的话,我不知道该方法是否应该内联。ARM肯定是RISC,所以这可能会发生。真的,问题仍然存在(一直如此),速度还是尺寸?这不会重复运行。只在菜单之间。所以速度根本不是问题。啊,我明白了。还是由你决定,但我只想做一个成员函数。