Существует ли способ заставить все частные функции-члены иметь внутреннюю связь?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Существует ли способ заставить все частные функции-члены иметь внутреннюю связь?

Сообщение Anonymous »

Если следующий код скомпилирован с использованием -O3 и -fPIC, компилятор не сможет встроить Foo::priv(), поскольку он имеет внешнюю связь. Напротив, Foo::priv2() может быть встроен, поскольку он имеет внутреннюю связь. В прямом эфире в Compiler Explorer

Код: Выделить всё

// foo.hpp
class Foo {
public:
int fn();
int fn2();

private:
static int priv();
static __attribute__((visibility("hidden"))) int priv2();
};

// foo.cpp
#include 

template 
int run(Func func)
{
int sum = 0;
for (int i = 0; i < 10'000'000; ++i) {
sum += func();
}
return sum;
}

int Foo::fn() { return run(&Foo::priv); }
int Foo::fn2() { return run(&Foo::priv2); }

int Foo::priv() { return 1; }
int Foo::priv2() { return 1; }
Я признаю, что компилятор не может оптимизировать Foo::fn() путем встраивания Foo::priv(), поскольку это возможно для а) некоторых другая динамическая библиотека для реализации Foo::priv() и б) другая динамическая библиотека подключается первой. В приведенном выше коде стоимость отказа от встраивания Foo::priv() значительна.
Представьте себе большую базу кода со множеством общих библиотек и можно гарантировать, что ровно одна общая библиотека предоставит определение частной функции-члена. Если это полезно, эту гарантию можно распространить на все функции-члены.
В этой ситуации есть ли какой-нибудь реальный вариант компиляции кода для включения встраивания для Foo::priv()< /code> без указания видимости вручную (или встраивания кода вручную)?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ernal-link
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»