Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does calling the constructor of an empty class actually use any memory?

Suppose I have a class like

class Empty{
    Empty(int a){ cout << a; }
}

And then I invoke it using

int main(){
    Empty(2);
    return 0;
}

Will this cause any memory to be allocated on the stack for the creation of an "Empty" object? Obviously, the arguments need to be pushed onto the stack, but I don't want to incur any extra overhead. Basically I am using the constructor as a static member.

The reason I want to do this is because of templates. The actual code looks like

template <int which>
class FuncName{
    template <class T>
    FuncName(const T &value){
        if(which == 1){
            // specific behavior
        }else if(which == 2){
            // other specific behavior
        }
    }
};

which allows me to write something like

int main(){
    int a = 1;
    FuncName<1>(a);
}

so that I get to specialize one template parameter, while not having to specify the type of T. Also, I am hoping the compiler will optimize the other branches away inside the constructor. If anyone knows if this is true or how to check, that would be greatly appreciated. I assumed also that throwing templates into the situation does not change the "empty class" problem from above, is that right?

like image 598
Victor Liu Avatar asked Jan 06 '10 21:01

Victor Liu


People also ask

What is the memory of an empty class?

The size of an empty class is not zero. It is 1 byte generally. It is nonzero to ensure that the two different objects will have different addresses.

What does an empty constructor do in java?

An empty static constructor prevents the type from being marked with the beforefieldinit flag. When the type is not marked as beforefieldinit , the type's initializer method is executed by either the first access to a static or instance field or the first invocation of any instance, virtual or static method.

What is the use of empty constructor in C++?

Use Empty Constructors in C++ Empty constructors are used when a class has only one constructor, and the default constructor is insufficient to initialize all member variables. Empty constructors can also be used to simplify the initialization of member variables.

Does a constructor create an object in memory?

A constructor does not allocate memory for the class object its this pointer refers to, but may allocate storage for more objects than its class object refers to. If memory allocation is required for objects, constructors can explicitly call the new operator.


1 Answers

Quoting Stroustrup:

Why is the size of an empty class not zero? To ensure that the addresses of two different objects will be different. For the same reason, "new" always returns pointers to distinct objects. Consider:

class Empty { };

void f()
{
    Empty a, b;
    if (&a == &b) cout << "impossible: report error to compiler supplier";

    Empty* p1 = new Empty;
    Empty* p2 = new Empty;
    if (p1 == p2) cout << "impossible: report error to compiler supplier";
}   

There is an interesting rule that says that an empty base class need not be represented by a separate byte:

struct X : Empty {
    int a;
    // ...
};

void f(X* p)
{
    void* p1 = p;
    void* p2 = &p->a;
    if (p1 == p2) cout << "nice: good optimizer";
}

This optimization is safe and can be most useful. It allows a programmer to use empty classes to represent very simple concepts without overhead. Some current compilers provide this "empty base class optimization".

like image 122
Richard Pennington Avatar answered Oct 30 '22 13:10

Richard Pennington