LINUX.ORG.RU

Модели данных

 


0

1

Сижу вот, занимаюсь байто**ством. Вот некоторые модели данных.

 	ILP32 	LP64 	LLP64 	ILP64
char 	8 	8 	8 	8
short 	16 	16 	16 	16
int 	32 	32 	32 	64
long 	32 	64 	32 	64
long long 	64 	64 	64 	64
size_t 	32 	64 	64 	64
pointer 	32 	64 	64 	64

Один чел мне говорит «Проверяй, если инт 8 байт, то юзай шорт». Однако, педивикии говорят что ляликс юзает LP64, а оффтоп LLP64, не понимаю где чел встретил ILP64 (или какую-то другую?).

Растолкуйте от чего отталкиваться? Какие модели данных надо учесть хотябы для самых распространенных случаев?

В самом идеале, конечно, свою прилагу я предполагаю запускать на линукс/фря/оффтоп 32/64. Вопрос вообще возник от того, что читаю бинарку из файла, и там может быть BE, а может быть LE byte order, плюс еще размер самих типов, и надо как-то это все перелопачивать под то, на чем я запущен в конкретный момент.

В данном случае вопрос касается только размера инта, но полюбому я зацеплюсь в каком-нибудь месте рогами во что-то еще. Хотя это уже будет другой вопрос.

Ответ на: комментарий от anonymous

Вы можете написать в Austin Group и потребовать вернуть любимый семибитный байт.

семибитный мне не нужен, спасибо.

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

А потом мы удивляемся, «почему у нас юникод не работает?»

Это у вас он не работает (-: У кого надо всё работает.

Да потому, что 99.99% программистов считают «символ» == «байт» == «8 бит»

Вы только что подошли на шаг ближе к истине. Если 99.99% считают, что в байте 8 бит, то это и есть стандарт. Хотите байт с плавающей длиной — вводите новую терминологию.

Попытки уместиться жопой на всех стульях как раз и порождает таких франкенштейнов, как стандарт C++. В котором std::vector::size() на 64-разрядной платформе возвращает беззнаковое (!) 64-битное (!) целое ради виртуальной совместимости вашего кода с какими-то микроконтроллерами, добавляя при этом гору реальных проблем с потенциальным underflow. Если в далёком будущем где-то в прикладных задачах и понадобится массив с 2 млрд+ элементов, то для этого будет использоваться всё что угодно, кроме стандартной библиотеки.

Применительно к вопросу главной темы. Можно писать код и по чистому стандарту. Но если он больше мешает, чем помогает, смело сужайте стандарт до целей вашего проекта.

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

Это у вас он не работает (-: У кого надо всё работает.

ну вы просто не в курсе, видать не юзали никогда. JFF попробуйте в <любимом ЯП> сделать что-то типа

$ echo "гыгыгы" | sed 's/./-/g'
------
в большинстве случаев не получится, а если и получится, то с каким-то нелепыми костылями.

Вы только что подошли на шаг ближе к истине. Если 99.99% считают, что в байте 8 бит, то это и есть стандарт. Хотите байт с плавающей длиной — вводите новую терминологию.

это называется совсем НЕ стандарт. Стандарты для того и вводят, что-бы разночтений не было. И что-бы была возможность расширения, ибо например в utf-8, символ≠байт.

В котором std::vector::size() на 64-разрядной платформе возвращает беззнаковое (!) 64-битное (!) целое

возвращает оно size_type aka std::size_t. Да, это uint64_t, но я не очень понимаю, ЧТО вам в этом не понравилось? Беззнаковое? Дык размер всегда такой, ибо беззнаковый может быть шире(и обычно так и есть), и размер может тупо не влезть в знаковый тип. Например нельзя выделить больше 2Гб на 32х битной платформе. Тупо потому, что стандартиризаторы захотели зачем-то знаковость. Что вам в 64х битности не понравилось на 64х битной же платформе — вообще не понимаю.

ради виртуальной совместимости вашего кода с какими-то микроконтроллерами

при чём тут контроллеры?

добавляя при этом гору реальных проблем с потенциальным underflow.

ЩИТО?

Если в далёком будущем где-то в прикладных задачах и понадобится массив с 2 млрд+

у меня уже много лет такие массивы. Мне что, удавиться из-за вашей блажи?

то для этого будет использоваться всё что угодно, кроме стандартной библиотеки.

std::vector это шаблон, и при правильном применении он имеет нулевой оверхед. Т.е. жрёт ресурсы как хорошая реализация на ассемблере. Почему его нельзя применять?

Да и если «нельзя» (да, я не применяю std::vector для такого, по инерции), то почему size() должен выдавать не размер типа «размер»(size_t), а размер типа Dendy_type?

Применительно к вопросу главной темы. Можно писать код и по чистому стандарту. Но если он больше мешает, чем помогает, смело сужайте стандарт до целей вашего проекта.

ну вот именно с этим я и не спорил. Применительно к случаю ТС, я уже говорил, что можно и нужно использовать специальные типы вроде uint32_t. Если речь о файлах(как у ТС), то POSIX вполне оправдан ИМХО.

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

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

Чего? :)

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

char например.

Я бы сказал, char это потолок. Отсюда вопрос, зачем вам std::vector, а не, скажем, std::unique_ptr<char[]>? Ведь единственный функционал, который используется — доступ к элементу по индексу. Ну и это вектор, но ведь такое же беззнаковое 64-битное используется и в std::map.

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

malloc получает size_t, он беззнаковый.

вот и я про то. Это был ответ на:

std::vector::size() на 64-разрядной платформе возвращает беззнаковое (!) 64-битное (!) целое

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

Я не знаю, на что это был ответ, только на 32битной платформе можно выделять через malloc/new более 2 Гб. :)

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

Я бы сказал, char это потолок. Отсюда вопрос, зачем вам std::vector, а не, скажем, std::unique_ptr<char[]>?

а зачем мне unique_ptr, если нужен vector?

Ведь единственный функционал, который используется — доступ к элементу по индексу.

ну и что? Почему это должно мне помешать брать std::vector::size() ?

Ну и это вектор, но ведь такое же беззнаковое 64-битное используется и в std::map.

почему в std::map::size() должен использоваться какой-то другой размер? А в std::unordered_map::size() что, третий?

В C/C++ уже давно везде используется size_t в качестве размера (и числа эл-тов), на кой ляд это менять?

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

только на 32битной платформе можно выделять через malloc/new более 2 Гб.

вот потому и можно, что size_t беззнаковый. Был-бы он знаковый, было-бы нельзя. Потому мне удивление и непонятно.

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

А, это был пример «что было бы, если ...»

Имхо не стоит для таких примеров, начинать предложение с «Вот например». ;)

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

а зачем мне unique_ptr, если нужен vector?

Я сильно сомневаюсь, что вы пользуетесь вектором как вектором. Скорее просто как оболочкой над указателем для обращения к куску памяти в 2 Гб+.

В C/C++ уже давно везде используется size_t в качестве размера

Вот это и есть единственный аргумент: давно используется. Ну, а то что в прикладных задачах от этого одни проблемы — смиритесь.

Считаю, что нужно было в своё время утвердить тип размера как int. В 0.01% случаях, когда нужен другой тип пользоваться basic_vector, basic_map и так далее с возможностью задать свой тип размера. Миллионы программистов сказали бы спасибо.

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

Я сильно сомневаюсь, что вы пользуетесь вектором как вектором.

зря сомневаетесь. Это действительно массив маленьких чисел 0..255. Такая огромная «текстовая строка».

Вот это и есть единственный аргумент: давно используется.

«давно используется» это не аргумент, а следствие того, что это нужно и годно.

Ну, а то что в прикладных задачах от этого одни проблемы — смиритесь.

использовали-бы что-то другое, например signed char. Не вижу проблемы. Сам можешь определить typedef signed char size_t; и пересобрать все библиотеки, если это по твоему «удобно».

Считаю, что нужно было в своё время утвердить тип размера как int. В 0.01% случаях, когда нужен другой тип пользоваться basic_vector, basic_map и так далее с возможностью задать свой тип размера. Миллионы программистов сказали бы спасибо.

тебя-бы убили, изнасиловали и съели. За порядок не ручаюсь, как и за кратность.

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