Предположим, что у меня есть несколько переменных inline constexpr
(с именами default_y
и default_x
) в заголовочном файле, и я решил переместить их в класс, с которым они полностью связаны, и пометить их static
(потому что это кажется лучше с точки зрения дизайна).
namespace Foo
{
inline constexpr std::streamsize default_size { 160 }; // not closely related to the class Bar
class Bar
{
public:
inline static constexpr std::uint32_t default_y { 20 }; // closely related to the class Bar
inline static constexpr std::uint32_t default_x { 20 }; // closely related to the class Bar
};
}
Итак, вопрос в том, будет ли это иметь значение с точки зрения того, как и когда они инициализируются в начале программы (и общей эффективности)? Будет ли ключевое слово inline
в этом конкретном случае использования заставлять компилятор добавлять некоторую защиту для этих двух переменных и замедлять доступ к ним? Или, может быть, потому что они constexpr
нет необходимости делать эти вещи во время выполнения, поскольку их значение можно получить из раздела исполняемого файла, доступного только для чтения, а затем присвоить им в начале потока главный?
Я построил программу один раз с помощью inline static
и один раз с static
, и не было никакой разницы в размере двоичного файла по сравнению с предыдущим решением, поэтому, возможно, компоновщик сгенерировал точно такой же код (надеюсь).
Размещение static inline constexpr
переменных никоим образом не должно влиять на эффективность. Из-за constexpr
они инициализируются const во время компиляции, если это возможно. Ключевое слово inline
здесь помогает вам инициализировать переменную static
внутри тела class
. Вам может быть интересен этот материал по ключевому слову inline
: https://pabloariasal.github.io/2019/02/28/cpp-inlining/.
Хорошая статья. Я нашел то, что искал.