Roy
Roy

Reputation: 3624

Should accessors be Inlined?

This is the declaration in the header file:

class PrimeSieve  
{
    populate(int lim);
    vector<int> sieve;
    long long limit;

    public:
        unsigned int limit();
};

Should I define the accessor method in the .cpp file or in the .h, inline?

I'm new to C++, but I'd like to follow best practices. I've seen this around in some of the books—is this considered standard?

unsigned int limit() { return limit; };

Upvotes: 13

Views: 4495

Answers (6)

Gregor Brandt
Gregor Brandt

Reputation: 7799

Most newer compilers are smart enough to inline what is necessary and leave everything else alone. So let the compiler do what its good at and don't try to second guess it.

Put all your code in the .cpp and the code declarations in the .h.

Upvotes: 7

Raedwald
Raedwald

Reputation: 48654

The argument for declaring the accessor inline is that this eliminates the call over-head, and can enable some further optimisations.

My experienced of measured performance is that the gain from doing this is usually rather modest. I consequently no longer do it by default.

Upvotes: 0

Simon Richter
Simon Richter

Reputation: 29586

For simple data types in classes fully visible to clients of the class, there is no real difference as you need to recompile the client whenever the class definition changes.

The main reason to make an accessor rather than use the member directly is to allow the implementation to remove the data member later on and still keep the interface compatible; if the interface containing the accessor is unchanged, the result is typically binary compatible, otherwise, it's source compatible. Having the accessor inline means defining it as part of the interface that you are changing, so you can ever only be source compatible.

The other reason to have an accessor is a DLL boundary: If your accessor needs to call into another function, and you allow it to be inlined, then this function's symbol needs to be exported to the client as well.

Depending on the complexity of the project, it can be beneficial to define an interface for your code as an abstract class, which allows you to change the implementation to your heart's content without the client ever seeing the change; in this case, accessors are defined as abstract in the interface class and clients cannot inline them, ever.

Upvotes: 0

BenH
BenH

Reputation: 2120

A good rule of thumb is to put all your code in the .cpp file, so this would argue against an inline function in the .h file.

Upvotes: 0

check123
check123

Reputation: 2009

More than being kind of global programming standards, these vary from organizations to organizaions. Of course, getLimit() would still be better than mere limit().

Upvotes: -1

Ben Voigt
Ben Voigt

Reputation: 283624

Definitely write the accessor inline in the header file. It makes better optimizations possible, and doesn't reduce encapsulation (since changes to the format of private data require recompiling all units that include the header anyway).

In the case of a complicated algorithm, you might want to hide the definition in an implementation file. Or when the implementation requires some types/header files not otherwise required by the class definition. Neither of those cases applies to simple accessors.

For one-liners, put it inside the class definition. Slightly longer member functions should still be in the header file, but might be declared explicitly inline, following the class definition.

Upvotes: 12

Related Questions