Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

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

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

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

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

Размер типов данных - C++
Здравствуй, Cyberforum. Меня интересует один вопрос, возможно он травиальный.. Почему в 8 битах (в одном байте) мы можем хранить 255...

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

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

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

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

С++ VLA и прочее... - C++
Перенесено из http://www.cyberforum.ru/cpp-beginners/thread713916.html Dev-C++ меня удивляет. Вот такой код компилирует без ошибок и...

10
gray_fox
What a waste!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
04.12.2013, 20:02 #2
nexen, можно использовать типы с фиксированным размером из <cstdint>.
1
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 - что они делают?
0
CheshireCat
Эксперт С++
2907 / 1256 / 81
Регистрация: 27.05.2008
Сообщений: 3,449
05.12.2013, 12:52 #4
Цитата Сообщение от nexen Посмотреть сообщение
Допустим, если записывают данные по сети или в двоичные файлы, sizeof(myStruct) или даже sizeof(int) уже не пойдет, ибо на некоторых архитектурах сработает на 8байт, а на других на 4байта.
А еще - сюрпрайз! - по Сети передаются не байты, а октеты.... :-)
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
05.12.2013, 13:22  [ТС] #5
CheshireCat, а в чем разница?
Октет в информатике — 8 двоичных разрядов (28). В русском языке октет обычно называют байтом.[1][2] Октет имеет 256 возможных состояний (кодов, значений).
0
CheshireCat
Эксперт С++
2907 / 1256 / 81
Регистрация: 27.05.2008
Сообщений: 3,449
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 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
05.12.2013, 14:03  [ТС] #7
CheshireCat, ага, кто-то со мной с калькулятора переписывается
0
gray_fox
What a waste!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 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 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
05.12.2013, 14:25  [ТС] #9
Цитата Сообщение от gray_fox Посмотреть сообщение
least - наименьший, не меньше указанного размера; fast - самый "быстрый", опять же не меньше указанного размера.
совсем не понял, как это к типам относится. "наименьший", "наибыстрейший"..?

alignas и alignof - спасибо, почитал
0
gray_fox
What a waste!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
05.12.2013, 14:29 #10
Цитата Сообщение от nexen Посмотреть сообщение
совсем не понял, как это к типам относится. "наименьший", "наибыстрейший"..?
Ну допустим у тебя есть два типа: int16_t и int32_t, последний считается более оптимальным. Тогда int_least8_t развернётся в int16_t, а int_fast8_t - в int32_t. Примерно так)
1
ValeryS
Модератор
7022 / 5360 / 531
Регистрация: 14.02.2011
Сообщений: 18,086
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
Привет! Вот еще темы с ответами:

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

Дирректива define и прочее - C++
Помогите пожалуйста решить задание, никогда раньше с такими не сталкивался! =( 1) Даны целые числа x, у и вещественное число z....

Рекурентная формула и прочее - C++
Добрый день , пишу вам для получения помощи! Никак не могу сделать рекурентную формулу и программу под выражением &quot;б&quot;Помогите...

Указатель на массив char и прочее - C++
Страуструп для проверки прочитанного в заданиях после одной из глав просит через typedef сделать пару объявлений и вот как делать некоторые...


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

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

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