Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are C++ class methods defined in the header always inlined?

Tags:

c++

header

linker

Edit: I've restored the original title but really what I should have asked was this: 'How do C++ linkers handle class methods which have been defined in multiple object files'

Say I have a C++ class defined in a header along these lines:

class Klass
{
    int Obnoxiously_Large_Method()
    {
        //many thousands of lines of code here
    }
}

If I compile some C++ code which uses 'Obnoxiously_Large_Method' in several locations, will the resulting object file always inline the code for 'Obnoxiously_Large_Method' or will it optimise for size (for example, when using g++ -Os) and create a single instance of 'Obnoxiously_Large_Method' and use it like a normal function?, if so, how do linkers resolve the collisions between other object files which have instantiated the same function?. Is there some arcane C++ namespace Juju which keeps the separate object instances of method from colliding with each other?

like image 316
Gearoid Murphy Avatar asked Dec 05 '11 22:12

Gearoid Murphy


2 Answers

7.1.2 Function specifiers

A function declaration (8.3.5, 9.3, 11.4) with an inline specifier declares an inline function. The inline specifier indicates to the implementation that inline substitution of the function body at the point of call is to be preferred to the usual function call mechanism. An implementation is not required to perform this inline substitution at the point of call; however, even if this inline substitution is omitted, the other rules for inline functions defined by 7.1.2 shall still be respected.

So, the compiler is not required to actually 'inline' any function.

However, the standard also says,

An inline function with external linkage shall have the same address in all translation units.

Member functions normally have external linkage (one exception is when the member function belongs to a 'local' class), so inline functions must have a unique address for cases where the address of the function is taken. In this case, the compiler will arrange for the linker to throw away all but one instance of a non-inlined copy of the function and fix-up all address references to the function to be to the one that's kept.

like image 131
Michael Burr Avatar answered Nov 14 '22 05:11

Michael Burr


Section [9.3], Member functions, of the C++98 Standard states:

A member function may be defined (8.4) in its class definition, in which case it is an inline member function (7.1.2).

Thus, it has always been the case that marking member functions defined in the class definition explicitly inline is unnecessary.

On the inline function specifier, the Standard states:

A function declaration (8.3.5, 9.3, 11.4) with an inline specifier declares an inline function. The inline specifier indicates to the [C++ compiler] that inline substitution of the function body at the point of call is to be preferred to the usual function call mechanism. [However, a C++ compiler] is not required to perform this inline substitution at the point of call;

So, it is up to the compiler whether it will actually inline the definition of the function rather than call it via the usual function call mechanism.

like image 27
Daniel Trebbien Avatar answered Nov 14 '22 05:11

Daniel Trebbien