Преимущество эффективности статического оператора C++ 23()C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Преимущество эффективности статического оператора C++ 23()

Сообщение Anonymous »

Я смотрю на мотивацию статического оператора(), изложенную в этой статье
https://www.open-std.org/jtc1/sc22/wg21/docs /papers/2021/p1169r2.html
где они объясняют, что функциональные объекты, часто используемые в алгоритмах STL, несут дополнительные затраты на хранение их указателя this в регистре, даже если оператор() не использует его.
Для этого они приводят следующий пример кода:
https://godbolt.org/z/ajTZo2
При запуске алгоритма использования статической функции функционального объекта вместо нестатического оператора() действительно создается более короткий ассемблерный код. (Они запускают его один раз с -DSTATIC и один раз без )
struct X {
bool operator()(int) const;
static bool f(int);
};

inline constexpr X x;

int count_x(std::vector const& xs) {
return std::count_if(xs.begin(), xs.end(),
#ifdef STATIC
X::f
#else
x
#endif
);
}

Однако, когда я меняю функции, чтобы они действительно что-то делали, будь то просто возврат true или сравнение параметра с жестко запрограммированным значением, различия кажутся исчезающими, и они появляются созданная сборка идентична, поэтому мне все еще приходится искать преимущества статического оператора().
#include
#include
using namespace std;

struct X {
bool operator()(int data ) { return data > 5; } ;
static bool f(int data) { return data > 5; } ;
};

inline constexpr X x;

int count_x(std::vector const& xs) {
return std::count_if(xs.begin(), xs.end(),
#ifdef STATIC
X::f
#else
x
#endif
);
}

может ли кто-нибудь объяснить?
Изменить:
Я подозревал, что причиной является встраивание.
Изменение кода на следующий возвращает различия
struct X {
bool operator()(int data ) ;
static bool f(int data);
};

__attribute__ ((noinline)) bool X::operator() (int data) {
{ return data > 5; }
}

__attribute__ ((noinline)) bool X::f(int data )
{ return data > 5; }

inline constexpr X x;

int count_x(std::vector const& xs) {
return std::count_if(xs.begin(), xs.end(),
#ifdef STATIC
X::f
#else
x
#endif
);
}


Подробнее здесь: https://stackoverflow.com/questions/784 ... c-operator
Ответить

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

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

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

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

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