2 / 2 / 0
Регистрация: 04.02.2013
Сообщений: 92

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

19.08.2015, 13:54. Показов 2322. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru