|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.02.2023, 10:04 | #11 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
А еще char где-то знаковый, где-то нет... Да, именно для этого и повводили типы фиксированной размерности и иже с ними.
|
26.02.2023, 05:52 | #12 | |||||||
Форумчанин
Регистрация: 26.10.2022
Сообщений: 119
|
Какие проблемы? Попробуйте в 3ds Max загрузить mesh, в котором > 2 миллиарда вершин. Он тупо crash-нется. Он crash-ится даже когда миллион вершин. Blender кстати нормально грузит.
Цитата:
https://www.programmersforum.ru/showthread.php?t=345144 Палитра -- массив из 256 цветов. Каждый пиксел картинки -- ровно один байт, индекс цвета в палитре. Вот разумный пример, когда индекс элемента массива хранится в unsigned char, а не size_t. В API для 3D-графики (OpenGL, Direct3D) есть index buffer-ы, в них хранятся индексы вершин, обычно там unsigned short. Цитата:
На движке Doom 3 действительно сделано немного игр (в Википедии написано, что 5). Давайте глянем Unreal Engine 4, на котором сделано много игр, которые потребляют гигабайты памяти. Класс FString: Цитата:
Цитата:
Цитата:
Это скорее вы вводите людей в заблуждение, потому что вот это ваше утверждение: не соответствует действительности. Я привёл примеры серьёзных проектов на C++ (Doom 3, Unreal Engine 4), в которых строковый класс и обобщённый динамический массив используют int для индексов и количества элементов. Если теоретики в книгах советуют использовать size_t, ну так на то они и теоретики. У реальных программистов нет времени книги писать. Разве что сообщения на форуме . В редких исключительных случаях, например когда делаем свой heap (распределитель памяти). Цитата:
Кстати, есть новый язык Zig, C-шного уровня, и там беззнаковое переполнение тоже считается undefined behavior: Цитата:
|
|||||||
26.02.2023, 09:21 | #13 |
фрилансер
Участник клуба
Регистрация: 11.10.2019
Сообщений: 1,010
|
Пётр Седов, серьёзность проекта (а перечисленные поделки - это именно поделки, ошибка в них ничего не значит) не исключает неточностей и ошибок в программах. Индекс в массивах - он только беззнаковый. К этому можно больше не возвращаться в обсуждении.
нет, не повод. Наличие UB в программе делает эту программу неработоспособной. На этом вопрос тоже можно закрыть. Когда есть шанс получить переполнение для беззнакового значения, это должен учитывать программист. И должен сам обработать эти случаи. Это и есть - серьёзный подход Единственный случай, когда для размера и индекса используется тип по размеру меньший, чем size_t - это когда нужно экономить место в памяти. Такие случаи очень редки Последний раз редактировалось Алексей1153; 26.02.2023 в 09:57. |
26.02.2023, 10:15 | #14 | |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Цитата:
Код:
Но если интересно, тогда разработчики команд процессора закладывают механизмы применения знаковых индексов для адресации в памяти. Это наглядно будет видно в 64-битном режиме, где используется 64-битные канонические адреса при составлении PLM5, PLM4, PDPTR, PDE и PTB таблиц и формировании виртуального адресного пространства. Вывод. При индексации в массивах для процессоров Intel всегда стоит брать переменную той же размерности, что и режим адресация в памяти. А в C++ для индексации отлично подходит int. С другой стороны в массивах обычно нету отрицательных индексов и количество элементов не может быть отрицательным. И для хранения количества элементов массива так и хочется использовать тип unsigned int. Но лучше использовать одинаковый тип для хранения длины и индекса в массиве. Так компилятор не станет перекладывать значение из одного регистра в другой лишний раз. ADD: К тому же в примере настройка палитры не осуществляется, а в нее загружены только первые 16 цветов. Последний раз редактировалось macomics; 26.02.2023 в 10:34. |
|
26.02.2023, 10:27 | #15 | |||||
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
Может стать MAX_INT, может стать отрицательным, может стать 0, компилятор, увидев приведение может везде считать int...
Без разницы. Если вы в регистр грузите байт, то компилятор/процессор обязан обнулить остальную часть регистра. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Он имеет право делать, что угодно. Например, считать, что оно никогда не случается и оптимизировать. |
|||||
05.03.2023, 07:42 | #16 | |||
Форумчанин
Регистрация: 26.10.2022
Сообщений: 119
|
Цитата:
Цитата:
1. Знаковое переполнение -- undefined behavior, то есть считается runtime-ошибкой. Это даёт компилятору право при debug-настройках генерировать машинный код, который такие ситуации обнаруживает, и как-то об этом сообщает (interrupt, assert, исключение, ...). 2. Беззнаковое переполнение -- undefined behavior, то есть считается runtime-ошибкой. Это даёт компилятору право при debug-настройках генерировать машинный код, который такие ситуации обнаруживает, и как-то об этом сообщает (interrupt, assert, исключение, ...). 3. Если программисту реально нужна беззнаковая арифметика по модулю pow(2, n) (для вычисления hash-функций, генерации случайных чисел, и других редких задач), то для этого в языке должны быть специальные функции вроде: Код:
То, что в C беззнаковое переполнение является легальной ситуацией (не undefined behavior, то есть не считается runtime-ошибкой) -- это дефект C, унаследованный C++, а вы предлагаете этим дефектом пользоваться, как будто это что-то хорошее. Я уже привёл пример, что в новых языках C-шного уровня (Zig) этот дефект исправляют. Заодно это позволяет делать оптимизации, невозможные в C. Цитата:
Да. Два серьёзных успешных проекта (Doom 3, Unreal Engine 4) от двух разных компаний -- вполне достаточно, чтобы опровергнуть сомнительное утверждение «Использование int для размеров и индексов - это некорректно». Да даже одного проекта было бы достаточно. Я может выразился не очень понятно, мысль была такая: * У реальных программистов нет времени писать книги. * У реальных программистов может быть время писать сообщения на форумах (или заметки в blog-ах, комментарии). Не знаю, что такое «ЮД», а для работы с файлами мне хватило бы чего-нибудь такого: Код:
Когда в C++-коде мешанина из целочисленных типов, в одних местах int, в других местах unsigned int (или DWORD, привет WinAPI), в третьих местах size_t (привет STL) -- это плодородная почва для bug-ов (особенно учитывая, как в C++ сделана беззнаковая арифметика, а это грабли, унаследованные от C). Удобнее, когда по всему коду используется один default-ный «стандартный» целочисленный тип, и 32-битный int на эту роль вполне нормально подходит, поэтому некоторые серьёзные проекты идут по такому пути. |
|||
15.03.2023, 03:15 | #17 |
Форумчанин
Регистрация: 13.03.2023
Сообщений: 113
|
Есть готовое простое решение.
Макрос size_t offsetof(type, member), определенный в <stddef.h>, возвращает смещение поля member от начала структуры type. Если member не выровнен по границе байта (т.е., если это битовое поле), то компилятор вернёт ошибку. См. стандарт ISO/IEC 9899:2018 (E), подраздел 7.19 Common defnitions <stddef.h>, п. 3, стр. 211. Разность двух смещений найдете самостоятельно? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Передача структуры из программы на c# в dll на c++ и получение структуры из dll | iukash | Общие вопросы .NET | 0 | 07.05.2013 16:03 |
Динамические структуры данных, списковые структуры (надо разобраться что делает программа) | _4Alex4_ | Помощь студентам | 1 | 14.11.2012 07:39 |
Написание программ (древовидные структуры, структуры неспециального вида и т.д.) | Green Gin | Фриланс | 2 | 27.04.2012 15:26 |
Управляющие структуры. Программирование алгоритмов разветвляющейся структуры. | Лёнка | Компоненты Delphi | 1 | 23.04.2012 15:03 |
структуры в С++ | серг | Общие вопросы C/C++ | 2 | 13.12.2009 15:08 |