Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
2 / 2 / 0
Регистрация: 04.02.2013
Сообщений: 92

Зависимость размера класса от типа данных

19.08.2015, 13:54. Показов 2290. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, вот такой вопрос возник:
Почему 2 класса с одинаковыми типами данных имеют разный размер:

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A {
char b[10];
double a;
int c;
}
 
class B {
double a;
char b[10];
int c;
}
 
int main(){
 
cout<<sizeof(A);//32 байта
cout<<sizeof(B);//24 байта
 
return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.08.2015, 13:54
Ответы с готовыми решениями:

Создание типа данных для чисел определенного размера
Здравствуйте. Столкнулся с проблемой работы с большими числами на разных архитектурах. На х64 размер long = 8. На х32 = 4. Мне нужно что бы...

Как вызвать из одного класса (для метода типа void) метод типа boolean другого класса?
ребят, только учусь и конечно, вопросов возникает много. ситуация вот в чем. есть массив. я должна найти в i-том элементе какую-то...

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

31
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
19.08.2015, 19:44
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Верно ли утверждение?:
Размер структуры после выравнивания равняется ближайщему кратному размеру найбольшего его типа.
Нет. Не размеру наибольшего типа, а наибольшему выравниванию любого из её членов.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.08.2015, 19:50
Цитата Сообщение от castaway Посмотреть сообщение
наибольшему выравниванию любого из её членов.
Цитата Сообщение от castaway Посмотреть сообщение
Ты путаешь размер A (32) с его выравниванием (8)
Как выравнивание может быть больше размера типа? Если адресс 9, ему надо минимум 16 для double. А это 7 байт для double максимум. И кратное 7-и уже бред.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
19.08.2015, 19:59
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Как выравнивание может быть больше размера типа?
Например так:
C++
1
2
3
    char c1 __attribute__(( aligned( 64 ) ));
    char c2 __attribute__(( aligned( 64 ) ));
    std::cout << (&c1 - &c2) << std::endl; // 64
Но это расширение GCC. Да и теоретически, выравнивание может быть вообще любым.
А откуда ты это взял? Я такое где-то говорил?

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Если адресс 9, ему надо минимум 16 для double. А это 7 байт для double максимум. И кратное 7-и уже бред.
Вот тут не понял. Поясни поподробней.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.08.2015, 20:07
Как я вижу логику компилятора:
- Так у меня есть структура
short
char
double

Я не могу записать short в адресс не кратное 2-ум байтам. Далее нужно всунуть будет char - тут любой подойдет. Дальше double - опять же его адресс должен быть кратен 8-и. Следовательно мне нужно взять любое место кратное 2-ойке, записать туда short и char + 5 байт на выравнивение, чтобы double запихнуть, который требует тратности 8-и. Итого надо найти ЛЮБОЙ адресс кратный двум с 16-ью последовательно свободными байтами.

Итого адресс всего размера кратен 8-и, и выравнивание МЕНЬШЕ 8-и == 5. Если больше то зачем вообще такого выравнивае плин.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
19.08.2015, 20:15
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Итого адресс всего размера кратен 8-и, и выравнивание МЕНЬШЕ 8-и == 5. Если больше то зачем вообще такого выравнивае плин.
Адрес "всего" я так понимаю адрес всей структуры.
5 - это так называемые padding-байты, нужные для выравнивание, это не само выравнивание.
В чём вопрос то?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.08.2015, 20:19


Чувствую себя как на экзамене. Где я ошибаюсь то, я расписал как я вижу процесс мышления компилятора
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
19.08.2015, 20:40
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Я не могу записать short в адресс не кратное 2-ум байтам. Далее нужно всунуть будет char - тут любой подойдет. Дальше double - опять же его адресс должен быть кратен 8-и. Следовательно мне нужно взять любое место кратное 2-ойке, записать туда short и char + 5 байт на выравнивение, чтобы double запихнуть, который требует тратности 8-и. Итого надо найти ЛЮБОЙ адресс кратный двум с 16-ью последовательно свободными байтами.
Всё верно.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.08.2015, 20:56
Цитата Сообщение от castaway Посмотреть сообщение
это так называемые padding-байты, нужные для выравнивание, это не само выравнивание
тогда почему в данном выражении, где для меня два одинаковых слагаемых - вы ставите не равно?

Добавлено через 10 минут
Колиство песка на воздушном шаре и есть балласт. Почему a != a ?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
19.08.2015, 21:06
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
тогда почему в данном выражении, где для меня два одинаковых слагаемых - вы ставите не равно?
Есть термин padding, а есть термин alignment.
Alignment у double в данном случае всегда будет 8, а padding не всегда 5. И это не одно и то же.

Я специально не цитировал ту строку, где ты 5 назвал выравниванием.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.08.2015, 21:16
Верно ли утверждение ?:
Выравнивание любого типа равно его размеру
и
Байтовое выравние в структурах всегда меньше максимальному размеру найбольшего типа
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
19.08.2015, 21:29
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Выравнивание любого типа равно его размеру
Нет. http://ideone.com/olslfu

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Байтовое выравние в структурах всегда меньше максимальному размеру найбольшего типа
Не понял.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.08.2015, 21:40
Цитата Сообщение от castaway Посмотреть сообщение
Нет
Цитата Сообщение от castaway Посмотреть сообщение
Не
Понятно, короче пойду учить PHP.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.08.2015, 21:40

Зависимость размера БД от количество символов в поле
Вечер добрый. Парни, прошу дать консультацию по основе БД: Вопрос 1. Есть текстовое поле базы длинной установленной, например, 20...

Зависимость размера текста от высоты компонента
Подскажите, каким образом можно выбирать размеры текста выводимого, например TextView, в зависимости от длины текста. Компонент должен...

Как убрать зависимость размера ячейки таблицы от размеров изображения?
Здравствуйте. Есть popup форма с описанием. Описание сделано в виде таблицы, в первой строке которой вставлены изображения. В...

Зависимость скорости вытекания воды из сосуда от размера отверстия в сосуде
Исследуйте зависимость скорости вытекания воды из сосуда от размера отверстия в сосуде Приборы и принадлежности: Сосуд с водой,...

Зависимость ссылок от типа конфигурации
У dotNet проекта есть около 10 различных конфигураций. В каждой конфигурации должны использоваться разные dll библиотеки подключаемые как...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru