std::byte
От: B0FEE664  
Дата: 05.10.18 14:34
Оценка: 9 (2)
А вы знали, что начиная с C++17 правила инициализации class enum были ослаблены и теперь теперь по попущению комитета объект enum'а можно инициализировать значением, которого нет в перечислении, если для enum'а указан underlying type? У меня такое впечатление, что это связано с реализацией std::byte в библиотеке. Соответственно вопрос:

Считаете ли вы реализацию std::byte в стандарте С++ провальной?
Автор: B0FEE664
Дата: 05.10.18
Вопрос: Считаете ли вы реализацию std::byte в стандарте С++ провальной?
И каждый день — без права на ошибку...
Re: std::byte
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.10.18 14:41
Оценка:
Здравствуйте, B0FEE664, Вы писали:

почему бы просто не задать этот вопрос в списке рассылки разрабов? и всем остальным было бы известно мнение авторов на этот счет...

а так да, "по попущению комитета объект enum'а можно инициализировать значением, которого нет в перечислении" — звучит плохо...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: std::byte
От: rg45 СССР  
Дата: 05.10.18 14:52
Оценка: +3
Здравствуйте, B0FEE664, Вы писали:

BFE>А вы знали, что начиная с C++17 правила инициализации class enum были ослаблены и теперь теперь по попущению комитета объект enum'а можно инициализировать значением, которого нет в перечислении, если для enum'а указан underlying type? У меня такое впечатление, что это связано с реализацией std::byte в библиотеке. Соответственно вопрос:

BFE>Считаете ли вы реализацию std::byte в стандарте С++ провальной?
Автор: B0FEE664
Дата: 05.10.18
Вопрос: Считаете ли вы реализацию std::byte в стандарте С++ провальной?


ИМХО, это весьма полезная возможность при реализации битовых флагов и масок, которую раньше приходилось обеспечивать через хаки.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: std::byte
От: night beast СССР  
Дата: 05.10.18 14:54
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>А вы знали, что начиная с C++17 правила инициализации class enum были ослаблены и теперь теперь по попущению комитета объект enum'а можно инициализировать значением, которого нет в перечислении, если для enum'а указан underlying type? У меня такое впечатление, что это связано с реализацией std::byte в библиотеке.


можно подробнее, как это связано с std::byte?
Re[2]: std::byte
От: uzhas Ниоткуда  
Дата: 05.10.18 14:57
Оценка: 4 (2) :)
Здравствуйте, night beast, Вы писали:

NB>можно подробнее, как это связано с std::byte?


std::byte является enum class
мдааа

сколько я не видел этих байтов, они всегда были алиасом к unsigned char
я другого варианта и не предвидел
если мне кто-то даст ссылки почитать, почему так, а не иначе задизайнили, то буду рад почитать
а пока смело в опросе ставлю провал не читал, но осуждаю
Re[3]: std::byte
От: night beast СССР  
Дата: 05.10.18 14:59
Оценка:
Здравствуйте, uzhas, Вы писали:

NB>>можно подробнее, как это связано с std::byte?


U>std::byte является enum class

U>мдааа

хм. неожиданно
Re: std::byte
От: AeroSun  
Дата: 05.10.18 15:08
Оценка: -1
Да норм, в фиксе исправят, а через релиз задепрекейтят.
Всё равно ими никто пользоваться не будет.
Re[2]: std::byte
От: B0FEE664  
Дата: 05.10.18 15:17
Оценка:
Здравствуйте, rg45, Вы писали:

R>ИМХО, это весьма полезная возможность при реализации битовых флагов и масок, которую раньше приходилось обеспечивать через хаки.


ИМХО, перечисление, флаги и маски — это три разные сущности и сделаны они должны быть с помощью трёх разных классов.
И каждый день — без права на ошибку...
Re[3]: std::byte
От: rg45 СССР  
Дата: 05.10.18 15:29
Оценка:
Здравствуйте, B0FEE664, Вы писали:

R>>ИМХО, это весьма полезная возможность при реализации битовых флагов и масок, которую раньше приходилось обеспечивать через хаки.


BFE>ИМХО, перечисление, флаги и маски — это три разные сущности и сделаны они должны быть с помощью трёх разных классов.


Вот прям должны? Флаги не должны задаваться перечеслениями, а битовая комбинация двух флагов должна иметь тип, отличный от типа одиночного флага?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: std::byte
От: Muxa  
Дата: 05.10.18 15:39
Оценка:
R>Вот прям должны? Флаги не должны задаваться перечеслениями, а битовая комбинация двух флагов должна иметь тип, отличный от типа одиночного флага?
конечно не должны, но было бы неплохо если бы это было так.
Re[5]: std::byte
От: rg45 СССР  
Дата: 05.10.18 15:44
Оценка:
Здравствуйте, Muxa, Вы писали:

R>>Вот прям должны? Флаги не должны задаваться перечеслениями, а битовая комбинация двух флагов должна иметь тип, отличный от типа одиночного флага?

M>конечно не должны, но было бы неплохо если бы это было так.

Хорошо, я понял, что "не должны" здесь вносит некоторую двусмысленность, поэтому переформулирую: это плохо, когда флаги задаются перечислениями? И обязательно ли битовая комбинация флагов должна иметь тип, отличный от типа одиночного флага?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: std::byte
От: B0FEE664  
Дата: 05.10.18 16:13
Оценка: +2
Здравствуйте, rg45, Вы писали:

R>>>ИМХО, это весьма полезная возможность при реализации битовых флагов и масок, которую раньше приходилось обеспечивать через хаки.

BFE>>ИМХО, перечисление, флаги и маски — это три разные сущности и сделаны они должны быть с помощью трёх разных классов.
R>Вот прям должны?
Если мы хотим иметь строго типизированный язык, то — да.

R>Флаги не должны задаваться перечеслениями, а битовая комбинация двух флагов должна иметь тип, отличный от типа одиночного флага?


Да. Я могу объяснить почему.

Разница между флагами и перечислениями:
1) у флагов и у перечислений разный набор операций. Для флагов операция | — логична, для перечисления она не имеет смысла.
2) флаги привязаны с битовому представлению, перечисления — нет.
3) этот пункт спорный, но его стоит упомянуть. Для перечисления логично иметь функции Next/Prev, а для флагов как правило они не нужны.

Разница между флагами и масками в том, что разные функции могут принимать в качестве аргументов либо маску, либо флаг, а если нет различия, то легко допустить ошибку. Например, флаг может быть конвертирован в текстовое представление, а маска, как правило — нет. Поэтому будет логично, если маску можно инициализировать флагом, а флаг маской — нет.
Есть и ещё одно различие между флагом и маской: маска может иметь значение 0, а флаг — нет.
И каждый день — без права на ошибку...
Re[6]: std::byte
От: Muxa  
Дата: 05.10.18 16:17
Оценка:
R>Хорошо, я понял, что "не должны" здесь вносит некоторую двусмысленность, поэтому переформулирую:
R>это плохо, когда флаги задаются перечислениями?
Например, при добавлении нового флага в перечисление, нужно не забыть задать ему (правильное) значение, иначе компилятор молча задаст ему неправильное как значение предыдущего+1.
При использовании, к примеру, констант забыть указать значение невозможно.

R>И обязательно ли битовая комбинация флагов должна иметь тип, отличный от типа одиночного флага?

Операции над флагами:
сравнение флагов -> bool (operator ==)
комбинация флагов -> маска (operator |)

Операции над масками:
объединить маски -> маска (operator |)
пересечь маски -> маска (operator &)

Операции над масками и флагами:
установить флаг -> маска (operator |)
сбросить флаг -> маска (operator'ы & и ~)
проверить флаг -> bool (operator &)

Невалидные операции:
флаг1 & флаг2

В скобках указано как оно обычно реализовано.
Как видишь есть пересечения, а значит неизбежны ошибки когда имели в виду одно, а написали другое, и компилятор ничего не сказал.
Re[5]: std::byte
От: rg45 СССР  
Дата: 05.10.18 20:59
Оценка:
Здравствуйте, B0FEE664, Вы писали:

R>>Флаги не должны задаваться перечеслениями, а битовая комбинация двух флагов должна иметь тип, отличный от типа одиночного флага?


BFE>Да. Я могу объяснить почему.


BFE>Разница между флагами и перечислениями:

BFE>1) у флагов и у перечислений разный набор операций. Для флагов операция | — логична, для перечисления она не имеет смысла.
BFE>2) флаги привязаны с битовому представлению, перечисления — нет.
BFE>3) этот пункт спорный, но его стоит упомянуть. Для перечисления логично иметь функции Next/Prev, а для флагов как правило они не нужны.

BFE>Разница между флагами и масками в том, что разные функции могут принимать в качестве аргументов либо маску, либо флаг, а если нет различия, то легко допустить ошибку. Например, флаг может быть конвертирован в текстовое представление, а маска, как правило — нет. Поэтому будет логично, если маску можно инициализировать флагом, а флаг маской — нет.

BFE>Есть и ещё одно различие между флагом и маской: маска может иметь значение 0, а флаг — нет.

Это всего лишь один из подходов, со своими плюсами и минусами. В противовес можно поставить другой подход — тот, который используется в .NET и который, с некоторыми корректировками, может быть перенесен в C++ (и я это делал). В этом подходе все с точностью до наоборот. И никогда я не слышал никаких жалоб, все просто и юзабельно. И, кстати, битовые маски спокойно конвертируются не только в текстовое представление, но и обратоно:

https://docs.microsoft.com/ru-ru/dotnet/api/system.flagsattribute?redirectedfrom=MSDN&view=netframework-4.7.2

https://agladky.ru/blog/flags-enums-in-csharp/
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: std::byte
От: PM  
Дата: 06.10.18 05:44
Оценка:
Здравствуйте, B0FEE664, Вы писали:


BFE>Считаете ли вы реализацию std::byte в стандарте С++ провальной?
Автор: B0FEE664
Дата: 05.10.18
Вопрос: Считаете ли вы реализацию std::byte в стандарте С++ провальной?


Нет, не считаю. Моё мнение — поживем, увидим. Применили смекалочку чтобы задешево получить strong typedef

Время до C++20 еще есть, чтобы набрать практику применения, найти еще несостыковки с другими частями языка, и объявить в этом случаем нерекомендуемым к использованию, если что.
Re: std::byte
От: AleksandrN Россия  
Дата: 06.10.18 21:33
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Считаете ли вы реализацию std::byte в стандарте С++ провальной?


Я не понял, зачем std::byte вообще нужен и чем не устраивает uint8_t и int8_t?
Re[2]: std::byte
От: andyp  
Дата: 07.10.18 10:46
Оценка:
Здравствуйте, AleksandrN, Вы писали:

AN>Я не понял, зачем std::byte вообще нужен и чем не устраивает uint8_t и int8_t?


Байт — минимально адресуемая сущность. В ней не обязательно 8 бит.
Re[5]: std::byte
От: Кодт Россия  
Дата: 07.10.18 14:59
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Если мы хотим иметь строго типизированный язык, то — да.


Всё правильно сказал, кроме того, что эта дорога приведёт нас к окамлу поверх плюсов.

Если волюнтаристски ввести, что комбинация флагов — это ад-хок маска, то легаси код сломается, а тот, который не сломается — не сломается потому, что там уже понатыкан реинтерпрет-каст.
Перекуём баги на фичи!
Re[3]: std::byte
От: AleksandrN Россия  
Дата: 08.10.18 10:47
Оценка:
Здравствуйте, andyp, Вы писали:

A>Здравствуйте, AleksandrN, Вы писали:


AN>>Я не понял, зачем std::byte вообще нужен и чем не устраивает uint8_t и int8_t?


A>Байт — минимально адресуемая сущность. В ней не обязательно 8 бит.


Я это знаю. Но используются ли сейчас аппаратные архитектуры, в которых байт не 8-битный? Даже если используются, не лучше ли для байта сделать целочисленный тип нужно размера, вместо enum class?
Re[4]: std::byte
От: andyp  
Дата: 08.10.18 11:09
Оценка:
Здравствуйте, AleksandrN, Вы писали:

AN>Но используются ли сейчас аппаратные архитектуры, в которых байт не 8-битный?


Да. Архитектуру с 16ти битными байтами сам использовал.

AN>Даже если используются, не лучше ли для байта сделать целочисленный тип нужно размера, вместо enum class?


Не знаю. Может, не хотели сам язык трогать и обошлись только стандартной библиотекой. Единственное, что на ум приходит — у него выравнивание должно быть как у unsigned char. Лучше бы все таки в язык его вкрутили имхо.
Re[5]: std::byte
От: AleksandrN Россия  
Дата: 08.10.18 11:36
Оценка:
Здравствуйте, andyp, Вы писали:

A>Да. Архитектуру с 16ти битными байтами сам использовал.


Какой это процессор? 16-битный байт там для совместимости с чем-то древним или же это сделано для эффективности решения задач, под которые заточен этот процессор? Какой размер там у char, short, int, long и long long?
Re[6]: std::byte
От: andyp  
Дата: 08.10.18 12:11
Оценка: 1 (1)
Здравствуйте, AleksandrN, Вы писали:

AN>Какой это процессор? 16-битный байт там для совместимости с чем-то древним или же это сделано для эффективности решения задач, под которые заточен этот процессор? Какой размер там у char, short, int, long и long long?


Сигнальник от TI TMS320C55x. Сделано так для эффективности.


type size (bits)
------------------------------
char 16
short 16
int 16
long 32
long long 40
float 32
double 32
Re[7]: std::byte
От: N. I.  
Дата: 08.10.18 19:47
Оценка:
andyp:

A>type               size (bits)
A>  ------------------------------
A>  char               16
A>  short              16
A>  int                16
A>  long               32
A>  long long          40
A>  float              32
A>  double             32

Там long long 2.5 байта занимает, что ли? Или 40 — это только количество задействованных в хранении значения бит, к которым добавляется padding из 8 или 24 бит? В любом случае получается, что это какая-то кривая реализация, т.к. по правилам C/C++ long long должен уметь хранить все числа от —(263 — 1) до 263 — 1.
Re[8]: std::byte
От: andyp  
Дата: 08.10.18 20:43
Оценка:
Здравствуйте, N. I., Вы писали:

NI>Там long long 2.5 байта занимает, что ли? Или 40 — это только количество задействованных в хранении значения бит, к которым добавляется padding из 8 или 24 бит? В любом случае получается, что это какая-то кривая реализация, т.к. по правилам C/C++ long long должен уметь хранить все числа от —(263 — 1) до 263 — 1.


Это ограничение из за регистира. У железки 40-битный аккумулятор, в котором она результаты multiply-accumulate накапливает .
Re[9]: std::byte
От: N. I.  
Дата: 09.10.18 16:24
Оценка:
andyp:

NI>>Там long long 2.5 байта занимает, что ли? Или 40 — это только количество задействованных в хранении значения бит, к которым добавляется padding из 8 или 24 бит? В любом случае получается, что это какая-то кривая реализация, т.к. по правилам C/C++ long long должен уметь хранить все числа от —(263 — 1) до 263 — 1.


A>Это ограничение из за регистира. У железки 40-битный аккумулятор, в котором она результаты multiply-accumulate накапливает .


Можно было программно операции над 64-битными целыми реализовать, а какой-нибудь __int40 — в качестве расширения сделать.
Re[10]: std::byte
От: andyp  
Дата: 09.10.18 18:46
Оценка:
Здравствуйте, N. I., Вы писали:

NI>Можно было программно операции над 64-битными целыми реализовать, а какой-нибудь __int40 — в качестве расширения сделать.


Архитектура CPU тянется из 90х, когда для таких процессоров на ассемблере в основном писали. Так что само наличие C и C++ — уже праздник.
Re[6]: std::byte
От: B0FEE664  
Дата: 11.10.18 03:45
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Всё правильно сказал, кроме того, что эта дорога приведёт нас к окамлу поверх плюсов.

Это чем-то плохо?

К>Если волюнтаристски ввести, что комбинация флагов — это ад-хок маска, то легаси код сломается, а тот, который не сломается — не сломается потому, что там уже понатыкан реинтерпрет-каст.


Какой ещё легаси код для типа std::byte? 70% вообще не знают об этом типе.
Если же вообще говорить об enum class, то зачем флагам class? Пользовались enum, пусть и дальше пользуются...
И каждый день — без права на ошибку...
Re[6]: std::byte
От: B0FEE664  
Дата: 11.10.18 04:01
Оценка:
Здравствуйте, rg45, Вы писали:

R>Это всего лишь один из подходов, со своими плюсами и минусами. В противовес можно поставить другой подход — тот, который используется в .NET и который, с некоторыми корректировками, может быть перенесен в C++ (и я это делал). В этом подходе все с точностью до наоборот. И никогда я не слышал никаких жалоб, все просто и юзабельно. И, кстати, битовые маски спокойно конвертируются не только в текстовое представление, но и обратоно:


R>https://docs.microsoft.com/ru-ru/dotnet/api/system.flagsattribute?redirectedfrom=MSDN&view=netframework-4.7.2

R>https://agladky.ru/blog/flags-enums-in-csharp/

Если так хочется думать, что С# — это С++, что флаги — это перечисления, то ввели бы атрибут [[flags]], как это сделано в C# и для него ослабили бы правила. Можно было бы и дефолт значения инициализации сделать степенью двойки. А вот зачем сделано так коряво, как сделано — .
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.