c++中多个构造函数的内存使用

Memory usage of multiple constructors c++

本文关键字:内存 构造函数 c++      更新时间:2023-10-16

我正在为任天堂DS(带有4MB RAM)编写c++代码。我创建了一个button类来在UI中显示按钮。为了方便,我有四个独立的构造函数。我可以把它们都压缩到一个结构中,但这很不方便,因为每次构造它时都需要使用所有的参数。我的问题是

当程序运行时,多个重载构造函数会占用每个对象更多的内存吗?或者编译器会自动剥离每个对象不需要的其他3个不必要的构造函数吗?

任何帮助都是感激的。下面是带有解释的构造函数的实参:

Button::Button(int x, int y, const char * const label)
{
    //Set visibility to true as a default
    //Set length to String length
}
Button::Button(int x, int y, const char * const label, bool isVisible)
{
    //Set the length to the string length
}
Button::Button(int x, int y, const char * const label, int length)
{
    //set visibility to true as a default
}
Button::Button(int x, int y, const char * const label, int length, bool isVisible)
{
    //All the variables are specified using constructor
}

虽然我同意其他的答案,但减少构造函数的数量不会为您节省任何对象存储成本,您可能应该只是为了方便而这样做。

我可以把它们都压缩成一个结构,但是这会很不方便,因为每次构造它时我都需要使用所有的参数。

不必这样:这是默认形参的作用。在头文件中创建构造函数的原型:

class Button {
    Button (
        int x,
        int y,
        const char * const label,
        int length = -1, 
        bool isVisible = true
);

注意最后两个参数后面的=。这意味着您不必提供这些值,如果不提供,则将使用该值。所以:

new Button(1, 2, "hello");
new Button(1, 2, "hello", 5, false);

都很好。您通常定义构造函数,尽管这里的length字段有点特殊;如果它可能取决于用户提供的label 的长度,则需要知道其中的区别。因此,在初始化列表中,如果与length参数对应的成员字段称为length(不是我最喜欢的做法,但在这里无关紧要):

length (length > 0 ? length : label.length())

length将初始化用户参数g,如果它大于0,默认值是-1,所以如果没有提供该参数g,将使用label.length()


请注意,参数必须按顺序进行,因此您应该考虑哪些最有可能被使用。如果在这种情况下,您希望允许指定其中一个默认参数而不指定另一个,则需要两个构造函数。

构造函数的数量不会改变每个对象所使用的内存。添加构造函数不会影响对象的大小。

不,代码使用的内存不是每个对象而是每个类。不管你有多少个类的实例(对象),只会有一个代码副本。

只有非静态数据成员(成员变量)是每个实例的