Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
1

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

04.12.2013, 19:59. Просмотров 556. Ответов 10
Метки нет (Все метки)

Как обычно борются с тем, что примитивный тип от компа к компу разного размера? Допустим, если записывают данные по сети или в двоичные файлы, sizeof(myStruct) или даже sizeof(int) уже не пойдет, ибо на некоторых архитектурах сработает на 8байт, а на других на 4байта.
Тот же фокус с выравниванием. Немногие, но некоторые, процессоры отказываются работать с double, если он выравнен не по 8байтному слову. Если я принудительно укажу компилятору, чтобы он не занимался выравниванием самостоятельно в структурах, то могу полностью убить работу на некоторых машинах. А ведь иногда это (отключение автоматической упаковки) убрать лучше, ибо где-то можно сократить размер структур, а где-то, наоборот, увеличить, но так же поднять производительность со своим выравниванием.

Есть статьи по этим темам? Подкиньте ссылки?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2013, 19:59
Ответы с готовыми решениями:

Размер типов данных
Здравствуй, Cyberforum. Меня интересует один вопрос, возможно он травиальный.. ...

Ошибка при сохранении больших чисел в тип int (размер встроенных типов)
В двумерном целочисленном массиве (размер массива: N, M - указываются в ручную)...

Парочка примитивных неясностей о массивах и C-strings
Когда я пишу: char * arr = new char; Выделяется память размером 7 байт под...

Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов.
Буду благодарен! Найти предельные значения для целочисленных типов. Не...

Разработайте перегружены функции, в которые передаются два параметра типов int или float и три параметра типов
Разработайте перегружены функции, в которые передаются два параметра типов int...

10
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
04.12.2013, 20:02 2
nexen, можно использовать типы с фиксированным размером из <cstdint>.
1
nexen
187 / 180 / 25
Регистрация: 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 - что они делают?
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
05.12.2013, 12:52 4
Цитата Сообщение от nexen Посмотреть сообщение
Допустим, если записывают данные по сети или в двоичные файлы, sizeof(myStruct) или даже sizeof(int) уже не пойдет, ибо на некоторых архитектурах сработает на 8байт, а на других на 4байта.
А еще - сюрпрайз! - по Сети передаются не байты, а октеты.... :-)
1
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
05.12.2013, 13:22  [ТС] 5
CheshireCat, а в чем разница?
Октет в информатике — 8 двоичных разрядов (28). В русском языке октет обычно называют байтом.[1][2] Октет имеет 256 возможных состояний (кодов, значений).
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
05.12.2013, 13:43 6
Открой для себя мир архитектур, аппаратно отличных от x86.....

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

И кстати да, если ты передаешь данные по Сети, ты в общем случае не знаешь, какая там архитектура на "том конце". Может оказаться и что-нибудь экзотическое.....
1
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
05.12.2013, 14:03  [ТС] 7
CheshireCat, ага, кто-то со мной с калькулятора переписывается
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 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, но про них я сам не особо что знаю.
1
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
05.12.2013, 14:25  [ТС] 9
Цитата Сообщение от gray_fox Посмотреть сообщение
least - наименьший, не меньше указанного размера; fast - самый "быстрый", опять же не меньше указанного размера.
совсем не понял, как это к типам относится. "наименьший", "наибыстрейший"..?

alignas и alignof - спасибо, почитал
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
05.12.2013, 14:29 10
Цитата Сообщение от nexen Посмотреть сообщение
совсем не понял, как это к типам относится. "наименьший", "наибыстрейший"..?
Ну допустим у тебя есть два типа: int16_t и int32_t, последний считается более оптимальным. Тогда int_least8_t развернётся в int16_t, а int_fast8_t - в int32_t. Примерно так)
1
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,673
05.12.2013, 14:30 11
Цитата Сообщение от nexen Посмотреть сообщение
Допустим, если записывают данные по сети или в двоичные файлы, sizeof(myStruct) или даже sizeof(int) уже не пойдет, ибо на некоторых архитектурах сработает на 8байт, а на других на 4байта.
в общем случае никак не прочитаешь
нужно знать протокол обмена за что каждый байт отвечает
1
05.12.2013, 14:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2013, 14:30

С++ VLA и прочее...
Перенесено из http://www.cyberforum.ru/cpp-beginners/thread713916.html ...

Скремблирование и прочее
Добрый день, помогите разобраться. Нужно написать программу для скремблирование...

Дирректива define и прочее
Помогите пожалуйста решить задание, никогда раньше с такими не сталкивался! =(...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru