Size: a a a

2020 November 13

АК

Александр Караев... in pro.cxx
Egor Kuzmin
Добрый день. 20 плюсы, gcc 10. Никак не могу догадаться как решить следующую проблему. Конструируется std::string_view, но он может быть сконструирован в compile time и в runtime. Если он конструируется в runtime, то я знаю его размер (пусть будет 36). А вот в compile мне нужно получить этот размер из функции std::string_view::size. Размер этот мне нужно в compile.
Используется в примерно таком макросе: https://godbolt.org/z/bTaW86
ты складываешь рантайм и компайл-тайм значения, получаешь рантайм.
std::string{ 36 } - это уже рантайм (пока не написан constexpr)
источник

AN

Alexander N in pro.cxx
Побитый Кирпич
is_signed<char>

и
is_same<char, signed char>

Это два разных свойства
Но ведь в теории, если дефолтный char unsigned, то is_signed должен дать false
источник

ПК

Побитый Кирпич... in pro.cxx
Alexander N
Но ведь в теории, если дефолтный char unsigned, то is_signed должен дать false
is_unsigned<char>
и
is_same<char, unsigned char>
Это два разных свойства
источник

EK

Egor Kuzmin in pro.cxx
Александр Караев
ты складываешь рантайм и компайл-тайм значения, получаешь рантайм.
std::string{ 36 } - это уже рантайм (пока не написан constexpr)
Это просто пример. Грубо говоря, мне нужно проверить является ли std::string_view значением compile, если да, то я бы вызвал size(), если нет, то подставил бы 36.
источник

N

Neargye in pro.cxx
Egor Kuzmin
Это просто пример. Грубо говоря, мне нужно проверить является ли std::string_view значением compile, если да, то я бы вызвал size(), если нет, то подставил бы 36.
если только гсс, посмотрите __builtin_constant_p
источник

EK

Egor Kuzmin in pro.cxx
Danya
А какую проблему вы вообще пытаетесь решить этим макросом?
На стеке нужен массив и нужно вычислить его размер. Если передается литерал, то беру его размер, если нет, то точно знаю, что будет определенное число, например, 36.
источник

EK

Egor Kuzmin in pro.cxx
Neargye
если только гсс, посмотрите __builtin_constant_p
Спасибо. Встречал такое решение, но может есть способ из стандарта.
источник

АК

Александр Караев... in pro.cxx
Egor Kuzmin
Это просто пример. Грубо говоря, мне нужно проверить является ли std::string_view значением compile, если да, то я бы вызвал size(), если нет, то подставил бы 36.
ага, уже лучше.. текущим стандартом - никак.

при передаче в функцию можно было бы проифать по is_constant_evaluated(), но аргументы функции не являются constexpr даже в этом случае, поэтому вытащить constexpr size() из аргумента не выйдет.

до того, как что-то куда-то было передано, нельзя узнать (без хака типа __builtin_constant_p()), является ли значение compile-time
источник

AK

Andrei K in pro.cxx
Александр Караев
ага, уже лучше.. текущим стандартом - никак.

при передаче в функцию можно было бы проифать по is_constant_evaluated(), но аргументы функции не являются constexpr даже в этом случае, поэтому вытащить constexpr size() из аргумента не выйдет.

до того, как что-то куда-то было передано, нельзя узнать (без хака типа __builtin_constant_p()), является ли значение compile-time
А там у автора вопроса макрос.
источник

АК

Александр Караев... in pro.cxx
Andrei K
А там у автора вопроса макрос.
так это не меняет сути, я ведь расписал варианты, во что можно раскрыть макрос
источник

EK

Egor Kuzmin in pro.cxx
Александр Караев
ага, уже лучше.. текущим стандартом - никак.

при передаче в функцию можно было бы проифать по is_constant_evaluated(), но аргументы функции не являются constexpr даже в этом случае, поэтому вытащить constexpr size() из аргумента не выйдет.

до того, как что-то куда-то было передано, нельзя узнать (без хака типа __builtin_constant_p()), является ли значение compile-time
Первое, что пробовал - это std::is_constant_evaluated. Спасибо, значит придется хак использовать.
источник

AK

Andrei K in pro.cxx
А зачем вам вообще такое?
источник

AK

Andrei K in pro.cxx
Может есть другие решения общей проблемы?
источник

D

Danya in pro.cxx
Egor Kuzmin
Первое, что пробовал - это std::is_constant_evaluated. Спасибо, значит придется хак использовать.
Из компайл тайм значений могут быть только литералы?
источник

AK

Andrei K in pro.cxx
В целом, можно использовать std::span, например.
источник

AK

Andrei K in pro.cxx
В нём можно легко выяснять компайлтаймовый размер или рантаймовый.
источник

АК

Александр Караев... in pro.cxx
Andrei K
А зачем вам вообще такое?
судя по тому, как активно используется __builtin_constant_p в разных специфичных библиотеках, это очень и очень полезный приём для оптимизации.
печально, что язык не предоставляет подобных средств
источник

AK

Andrei K in pro.cxx
Нет, я не про этот билтын. Я про задачу, которую автор пытается решить. Может быть на решается иначе.
источник

I

Ioann_V in pro.cxx
Ребята у меня странный вопрос в виду не очень понятного бага в коде - спин локи, они на видимость переменных в других потоках которые меняются внутри блокировки - влияют?
источник

D

Danya in pro.cxx
@egorspk https://godbolt.org/z/qcEeqn что насчёт такого?
источник