Почему оператор boost :: shared_ptr -> не объявлен встроенным? - PullRequest
2 голосов
/ 18 мая 2010

Поскольку boost::shared_ptr можно вызывать очень часто и просто возвращает указатель, не является ли оператор -> хорошим кандидатом на то, чтобы быть inlined?

T * operator-> () const // never throws
{
    BOOST_ASSERT(px != 0);
    return px;
}

Будет ли хороший компилятор автоматически inline это все равно?

Должен ли я потерять сон из-за этого? : -)

Ответы [ 3 ]

18 голосов
/ 18 мая 2010

Функции, определенные (т.е. с телом) внутри класса, неявно являются кандидатами для встраивания. В этих случаях нет необходимости использовать ключевое слово inline, и это необычно.

4 голосов
/ 18 мая 2010

Может ли хороший компилятор автоматически встроить это в любом случае?

Вполне возможно, да, было бы.

Должен ли я потерять сон из-за этого?

Лучше нет. Если вы хотите быть супер-уверенным (или вы очень любопытны), проверьте сборку, исходящую от вашего компилятора.

1 голос
/ 07 октября 2011

Обратите внимание, что shared_ptr является шаблоном класса , поэтому его функции-члены на самом деле являются шаблонами функций .

Поскольку они не export ed, они должны быть не только объявлены , но также определены во всех единицах перевода, где они используются, точно так же, как функция, определенная с inline спецификатор хранилища.

В некотором смысле, template также означает inline.

...