Форум программистов, компьютерный форум CyberForum.ru

Размер примитивных типов, выравнивание и прочее - C++

Восстановить пароль Регистрация
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
04.12.2013, 19:59     Размер примитивных типов, выравнивание и прочее #1
Как обычно борются с тем, что примитивный тип от компа к компу разного размера? Допустим, если записывают данные по сети или в двоичные файлы, sizeof(myStruct) или даже sizeof(int) уже не пойдет, ибо на некоторых архитектурах сработает на 8байт, а на других на 4байта.
Тот же фокус с выравниванием. Немногие, но некоторые, процессоры отказываются работать с double, если он выравнен не по 8байтному слову. Если я принудительно укажу компилятору, чтобы он не занимался выравниванием самостоятельно в структурах, то могу полностью убить работу на некоторых машинах. А ведь иногда это (отключение автоматической упаковки) убрать лучше, ибо где-то можно сократить размер структур, а где-то, наоборот, увеличить, но так же поднять производительность со своим выравниванием.

Есть статьи по этим темам? Подкиньте ссылки?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
04.12.2013, 20:02     Размер примитивных типов, выравнивание и прочее #2
nexen, можно использовать типы с фиксированным размером из <cstdint>.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
05.12.2013, 12:48  [ТС]     Размер примитивных типов, выравнивание и прочее #3
gray_fox, size_t использовать нельзя, выходит?

Добавлено через 5 минут
gray_fox, http://www.cplusplus.com/reference/cstdint/?kw=cstdint
Можете пояснить пару моментов?
1) Выходит, что даже если я указываю использование 64битных целых, оно может не поддерживаться? Такое часто случается?
2) Чем least от fast отличаются так и не понял
3) Последние 4 макроса, начиная с : INTMAX_C - что они делают?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
05.12.2013, 12:52     Размер примитивных типов, выравнивание и прочее #4
Цитата Сообщение от nexen Посмотреть сообщение
Допустим, если записывают данные по сети или в двоичные файлы, sizeof(myStruct) или даже sizeof(int) уже не пойдет, ибо на некоторых архитектурах сработает на 8байт, а на других на 4байта.
А еще - сюрпрайз! - по Сети передаются не байты, а октеты.... :-)
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
05.12.2013, 13:22  [ТС]     Размер примитивных типов, выравнивание и прочее #5
CheshireCat, а в чем разница?
Октет в информатике — 8 двоичных разрядов (28). В русском языке октет обычно называют байтом.[1][2] Октет имеет 256 возможных состояний (кодов, значений).
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
05.12.2013, 13:43     Размер примитивных типов, выравнивание и прочее #6
Открой для себя мир архитектур, аппаратно отличных от x86.....

Октет - 8 двоичных разрядов, или 8 бит. Байт - минимальная адресуемая компьютером совокупность битов, или минимальный адресуемый блок данных (MADU - Minimum Addressable Data Unit). В большинстве современных архитектур байт содержит 8 битов, однако успешно существуют архитектуры, в которых размер байта 16 или 32 бита. А в древние времена существовали архитектуры и с другим количеством битов в байте - 6, 32, 36.... Лично мне доводилось щупать руками ЭВМ, архитектура которой была основана на 18-битовых байтах (они там назывались "18-разрядными словами").

И кстати да, если ты передаешь данные по Сети, ты в общем случае не знаешь, какая там архитектура на "том конце". Может оказаться и что-нибудь экзотическое.....
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
05.12.2013, 14:03  [ТС]     Размер примитивных типов, выравнивание и прочее #7
CheshireCat, ага, кто-то со мной с калькулятора переписывается
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
05.12.2013, 14:20     Размер примитивных типов, выравнивание и прочее #8
Цитата Сообщение от nexen Посмотреть сообщение
gray_fox, size_t использовать нельзя, выходит?
Нет.
Цитата Сообщение от nexen Посмотреть сообщение
1) Выходит, что даже если я указываю использование 64битных целых, оно может не поддерживаться? Такое часто случается?
Не знаю, часто ли такое случается, но раз в доке так написано, то вполне возможно. Можно использовать unsigned char тогда, он минимум на 28 значений.
Цитата Сообщение от nexen Посмотреть сообщение
2) Чем least от fast отличаются так и не понял
least - наименьший, не меньше указанного размера; fast - самый "быстрый", опять же не меньше указанного размера.
Цитата Сообщение от nexen Посмотреть сообщение
3) Последние 4 макроса, начиная с : INTMAX_C - что они делают?
См. "For example" в самом низу, добавляет соответствующий суффикс в литералу.

Добавлено через 8 минут
По поводу выравнивания в последнем стандарте добавили alignas и alignof, но про них я сам не особо что знаю.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
05.12.2013, 14:25  [ТС]     Размер примитивных типов, выравнивание и прочее #9
Цитата Сообщение от gray_fox Посмотреть сообщение
least - наименьший, не меньше указанного размера; fast - самый "быстрый", опять же не меньше указанного размера.
совсем не понял, как это к типам относится. "наименьший", "наибыстрейший"..?

alignas и alignof - спасибо, почитал
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
05.12.2013, 14:29     Размер примитивных типов, выравнивание и прочее #10
Цитата Сообщение от nexen Посмотреть сообщение
совсем не понял, как это к типам относится. "наименьший", "наибыстрейший"..?
Ну допустим у тебя есть два типа: int16_t и int32_t, последний считается более оптимальным. Тогда int_least8_t развернётся в int16_t, а int_fast8_t - в int32_t. Примерно так)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2013, 14:30     Размер примитивных типов, выравнивание и прочее
Еще ссылки по теме:

Скремблирование и прочее C++
C++ Парочка примитивных неясностей о массивах и C-strings
C++ Рекурентная формула и прочее

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
05.12.2013, 14:30     Размер примитивных типов, выравнивание и прочее #11
Цитата Сообщение от nexen Посмотреть сообщение
Допустим, если записывают данные по сети или в двоичные файлы, sizeof(myStruct) или даже sizeof(int) уже не пойдет, ибо на некоторых архитектурах сработает на 8байт, а на других на 4байта.
в общем случае никак не прочитаешь
нужно знать протокол обмена за что каждый байт отвечает
Yandex
Объявления
05.12.2013, 14:30     Размер примитивных типов, выравнивание и прочее
Ответ Создать тему
Опции темы

Текущее время: 15:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru