Boost logo

Boost Users :

Subject: Re: [Boost-users] Inline functions in boost/utility
From: Ovanes Markarian (om_boost_at_[hidden])
Date: 2009-02-11 07:54:48


On Tue, Feb 10, 2009 at 5:59 PM, Niels Dekker - mail address until
2010-10-10 <niels_address_until_2010-10-10_at_[hidden]> wrote:

> Timenkov Yuri wrote:
>
>> Looking through assembly code of simple test produced by gcc with
>>> optimization, I've noticed that free functions in
>>> utility/value_init.hpp (get and set) are not declared as inline,
>>> though its body consist only of prologue and epilogue.
>>>
>>> Is there any reason for this or just a bug?
>>>
>>
> Sorry, I don't really get it. First of all, utility/value_init.hpp doesn't
> have a "set". Do you mean "swap"? But secondly it's really up to the
> compiler whether or not those functions are inlined. An "inline" keyword
> would only be a hint to the compiler to do so, in this case. But as
> value_init.hpp provides the complete definitions of the function templates,
> it shouldn't be hard for the compiler to apply inlining. Are you saying
> that gcc would /only/ inline those functions, when they are declared as
> inline?

Yuri,
Niels is right. This article might be of interest for you.

http://www.gotw.ca/gotw/033.htm

There are cases where you must declare a function as inline, otherwise a
linker will have ambiguity of more than one identical symbols and fail to
link:

header.h

void foo()
{
  // ...
}

cpp_file1.cpp

#include "header.h"

...

cpp_file2.cpp

#include "header.h"

...

This app will compile, but there will be 2 implementations of void foo(),
since each compilation unit will generate it's own one. Linker will fail due
to ambiguity which symbol is the right one. To fix this problem you have to
either leave a function declaration in the header and move its definition
into a cpp file or declare this function as inline.

Best Regards,
Ovanes



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net