LINUX.ORG.RU

насколько вообще нужны платформо-зависимые типы?

 


0

3

Обычные грабли при написании портируемых программ на си это, скажем, различные размеры int, (без)знаковость char итп.

И вот что подумалось. Эти все навороты вообще нужны? Мне кажется, это тяжкое наследие старины когда байт мог быть и не 8бит. Сейчас от этого лишь проблемы. Т.е. имеет смысл перейти, скажем, int8_t, int32_t... А вы что думаете? И нужны ли дополнительные обёртки типа size_t?

★★★★★

нужны ли дополнительные обёртки типа size_t?

Использую скорее не из-за платформо-независимости, а просто потому, что так ошибок меньше.

Deleted
()
Ответ на: комментарий от Deleted

Скорей ещё проще, size_t просто короче чем unsigned int.

frozenix ★★★
()

Эти все навороты вообще нужны?

Какие «навороты»?

Мне кажется, это тяжкое наследие старины когда байт мог быть и не 8бит

Наименьшая адресуемая единица и сейчас может быть не 8 бит.

Т.е. имеет смысл перейти, скажем, int8_t, int32_t... А вы что думаете?

Типы с указанной шириной имеют смысл только для ввода/вывода.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Какие «навороты»?

Типы с переменной длиной. Разве не проще писать программу зная что типы будут одними и теми же на всех платформах? Понятно что для указателей это не работает.

Типы с указанной шириной имеют смысл только для ввода/вывода.

Почему?

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Разве не проще писать программу зная что типы будут одними и теми же на всех платформах?

Не вижу ни упрощения, ни выгоды.

Типы с указанной шириной имеют смысл только для ввода/вывода.

Почему?

Потому что протоколы и дисковые форматы описываются независимо от разрядности платформы.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Не вижу ни упрощения, ни выгоды.

Некоторых ошибок можно было бы избежать. Вот какой смысл делать char знаковым на одних платформах и беззнаковым на других?

true_admin ★★★★★
() автор топика

Пропагандирую uintN_t в любых около-сишно-типовых беседах, от size_t не вижу повода отказываться, потому что говорящее название. Уж лучше, чем int.

Кстати, вот пример того, что си/++ преподавать вредно для неокрепшего моска: мой одногруппник на собеседовании на джависта сказал, что в джаве int имеет размер машинного слова. Так-то!

cdshines ★★★★★
()
Ответ на: комментарий от cdshines

в джаве int имеет размер машинного слова.

А что есть «машинное слово»? Почитали википедию, по-моему, это сферический конь в вакууме.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от frozenix

Это вроде бы наоборот плохо влияет на переносимость.

Мне кажется плохо влияет на переносимость то что размеры типов плавают. Правда, есть гайдлайны где написано что надо сделать чтобы всё работало.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от cdshines

от 16 до 64 бит

Я о том же — размер «слова» может быть любым в этих пределах. Нафига такая единица измерения вообще нужна?

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Русская вики не очень хороша в разделах информатики. Смотри второй абзац. 32-бит процессор - это процессор у которого машинное слово равно 32 битам. Хотя я вероятней всего тоже не так понял.

http://en.wikipedia.org/wiki/Word_(computer_architecture)

frozenix ★★★
()

Мне кажется, это тяжкое наследие старины когда байт мог быть и не 8бит. Сейчас от этого лишь проблемы.

а никто и не отменял «байт мог быть и не 8бит» и уж тем более не отменяли выравнивание.

exception13 ★★★★★
()
Ответ на: комментарий от exception13

а никто и не отменял «байт мог быть и не 8бит»

Есть современные платформы где байт не 8бит?

уж тем более не отменяли выравнивание.

Это уже другой вопрос.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

General purpose registers (GPRs) can store both data and addresses, i.e., they are combined Data/Address registers and rarely the register file is unified to include floating point as well.

cdshines ★★★★★
()
Ответ на: комментарий от frozenix

оно не зависит от разрядности хоста с виртуальной машины?

Размер int в Яве - не «машинное слово», а 32 бита. Ответ собеседуемого был неправильным.

tailgunner ★★★★★
()
Ответ на: комментарий от true_admin

Нет, от этого никуда не деться - это констатация факта) Просто, когда пишешь, нужно не забывать, что если ты объявил где-то инт, то нужно думать о том, где и как он будет использован, переполнение там, то-се. Если я не буду говорить «размер слова», то это не изменит положения вещей)

cdshines ★★★★★
()
Ответ на: комментарий от true_admin

Мне кажется плохо влияет на переносимость то что размеры типов плавают. Правда, есть гайдлайны где написано что надо сделать чтобы всё работало.

если ты используешь каноничные типы данных только во внутренних структурах то это никак и ни начто не влияет. а вот для обмена/схоронения по сети/на диске надо не только ширину но и последовательность байт учитывать.

exception13 ★★★★★
()
Ответ на: комментарий от cdshines

Обычно гугление в такой области не часто дает однозначный результат. Т.к. могут быть свои нюансы от платформы, разрядности и т.д.

frozenix ★★★
()

И нужны ли дополнительные обёртки типа size_t?

Нужны. Ты указываешь свое намерение

vertexua ★★★★★
()
Ответ на: комментарий от true_admin

Ай, что ты как маленький - вырываешь оттуда всякую фигню. A word is basically a fixed-sized group of bits that are handled as a unit by the instruction set and/or hardware of the processor.

Наверное, можно еще уточнить условия (например, что максимальный и т.д.), но суть ясна.

cdshines ★★★★★
()
Ответ на: комментарий от exception13

если ты используешь каноничные типы данных только во внутренних структурах то это никак и ни начто не влияет

Ну почему же. Зависит от того с какими данными работает программа. Например, если я оперирую большими числами то int32 мне не подойдёт и на 32битных платформах будут проблемы. Я вот об этом и говорю что в первую очередь нужно исходить из нужд программы, а не от мифических нативных типов. Имхо, конечно же.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

По-моему, это ничего не объясняет. Любой проц умеет работать с 8, 16, 32 и 64-битными целыми.

нет

exception13 ★★★★★
()
Ответ на: комментарий от true_admin

Ну почему же. Зависит от того с какими данными работает программа. Например, если я оперирую большими числами то int32 мне не подойдёт и на 32битных платформах будут проблемы. Я вот об этом и говорю что в первую очередь нужно исходить из нужд программы, а не от мифических нативных типов. Имхо, конечно же.

в пределах своего кода ты можешь использовать все что угодно. но если нужна какая либо связь с другими программами то будь добр полностью описывать типа и последовательность байт.

exception13 ★★★★★
()
Ответ на: комментарий от true_admin

Я ж говорил что-то про второй абзац.

The size of a word is reflected in many aspects of a computer's structure and operation; the majority of the registers in a processor are usually word sized and the largest piece of data that can be transferred to and from the working memory in a single operation is a word in many (not all) architectures. The largest possible address size, used to designate a location in memory, is typically a hardware word (here, «hardware word» means the full-sized natural word of the processor, as opposed to any other definition used).

Размер слова отображается во многих аспектах структур и операций компьютера. Большинство регистров в процессоре обычно равны размеру слова и самый большая часть данных, которые могут быть переданы в и из оперативной памяти за одну операцию является словом во множестве архитектур...

frozenix ★★★
()
Ответ на: комментарий от exception13

Регистр Общего Назначения

Ясно. Короче, размер word это просто соглашение. Потому что у современного проца есть регистры разных размеров. Да ещё к ним можно обращаться по частям.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

У меня есть знакомый Ънтерпрайзный писатель на си++, он пишет кроссплатформенную тулзу для работы с видео - байто@бство то еще. Так вот, у него, помимо обычных заголовков, есть еще бойлерплейт-простыня с #ifdef..., в которой разбирается, в какой среде запускается компиляние, и внутри уже в зависимости от типов, которые предоставляет ОС (ну, виндовые эти http://msdn.microsoft.com/en-us/library/aa383751(v=vs.85).aspx или из stdlib), делаются typedef'ы на унифицированные типы. И вообще, там какой-то ужос с этим всем. Наверное, каждый сишник в тайне надеется, что когда он умрет, подавившись указателем, его канонизируют как великомученика.

cdshines ★★★★★
()
Ответ на: комментарий от true_admin

Потому что у современного проца есть регистры разных размеров. Да ещё к ним можно обращаться по частям.

Вообще-то, в современных RISC-архитектурах все регистры общего назначения имеют одинаковый размер, а «по частям» к регистрам обращаться нельзя.

annulen ★★★★★
()
Ответ на: комментарий от true_admin

Ясно. Короче, размер word это просто соглашение. Потому что у современного проца есть регистры разных размеров. Да ещё к ним можно обращаться по частям.

ты делаешь меня фейспалм

exception13 ★★★★★
()
Ответ на: комментарий от true_admin

у современного проца есть регистры разных размеров

Примеры процессоров, у которых регистры общего назначения имеют разную длину - в студию.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Это, скорее, вопрос интерпретации того что, скажем, EAX может быть использован по частям. И эти части в литературе тоже называются регистрами.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Это, скорее, вопрос интерпретации того что, скажем, EAX может быть использован по частям.

Это вообще не вопрос. Размер РОН на IA32 - 32 бита, на amd64 - 64 бита.

И эти части в литературе тоже называются регистрами.

Это регистры другой архитектуры.

tailgunner ★★★★★
()

Проблемы обычно возникают, когда какой-то балбес кастит инт в поинтер и обратно, это не решается. То же с не-size_t индексом массива. А при использовании частей регистра между ними возникает зависимость, которая тормозит вывод мопов из исполнителя и затыкает очередь. В мануале интела советуют использовать только нативную ширину.

arturpub ★★
()

Ты только не забывай, когда будешь сохранять что-то в бинарном виде, делать преобразование вроде htonl, чтобы не было проблем на других архитектурах.

Anon
()

Сейчас от этого лишь проблемы.

Никогда с ними не было проблем у тех кто знает Си - ты не знаешь. Платформо-зависимые типы нужны компиляторам для оптимизации, без них компилятору приходится всегда генерировать лишний код для погромистов типа тебя.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.