Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/103: Рейтинг темы: голосов - 103, средняя оценка - 4.58
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
1

Размер структуры

30.11.2016, 15:52. Показов 21612. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго дня!

Не могу понять... Вот код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct T
{
    char i;
    int a;
    int b;
    int c;
    char j;
};
 
int main()
{
    T t;
    std::cout << sizeof(T);
    system("pause>nul");
}
Выводит размер структуры как 20... Почему 20? Почему не 17?..

Заранее спасибо!
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.11.2016, 15:52
Ответы с готовыми решениями:

Размер структуры
Помогите узнать размер структуры: enum UnitType { Swordsman, // мечник Archer, //...

Размер структуры?
Здравствуйте, дорогие форумчане! Есть доп. зд - подсчитать размер структуры. Только я очень слабо...

Странный размер структуры
Привет. Есть структура typedef struct t_ANDNonDirectionalBeacon { unsigned long track_id; ...

Размер структуры KEYBOARD_ATTRIBUTES
Пытаюсь портировать с c++ структуру KEYBOARD_ATTRIBUTES (...

19
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
30.11.2016, 15:55 2
Мобыть выравнивание лесов/полей?
1
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
30.11.2016, 15:57  [ТС] 3
Цитата Сообщение от _Ivana Посмотреть сообщение
Мобыть выравнивание лесов/полей?
Так а как оно происходит?
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
30.11.2016, 16:00 4
Я не спец, но думаю, как компилятор на память положит. Может есть какие прагмы чтобы влиять на его поведение в этих случаях. Можно погуглить, начав с "выравнивание полей структур".

Может у вас 32-разрядная система и компилятор под чары в структурах выделяет размер регистра - 4 байта.
1
Модератор
Эксперт С++
 Аватар для zss
13727 / 10923 / 6480
Регистрация: 18.12.2011
Сообщений: 29,157
30.11.2016, 16:02 5
Выравнивание идет на границы 32 битного слова.
Поэтому после каждого из char останется по 3 байта.
Итого: (1+3)+3*4+(1+3)=20 байт.
1
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
30.11.2016, 16:06  [ТС] 6
zss, то есть, любой тип приводится к 4-м?
Все, что меньше 4-х:
C++
1
char x[3];
например.
C++
1
short x;
тоже
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
30.11.2016, 16:10 7
Имхо к длине машинного слова данной архитектуры. В вашем случае это 4 байта.
1
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
30.11.2016, 16:13  [ТС] 8
_Ivana, zss, дошло, спасибо!
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
30.11.2016, 16:18 9
Тамика, раз пошла такая пьянка - попробуйте запилить структуру с 4 чарами подряд и двумя интами и посмотрите ее размер. А потом погуглите какую-нибудь packed - прагму или что там бывает, чтобы добиться ужатия первых четырех чаров в одно 32-битное слово.
1
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
30.11.2016, 16:19  [ТС] 10
Практика подтвердила!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct T
{
    short int i;
    int a = 66;
    int b = 77;
    int c = 88;
    char j;
};
 
void show(const char* aT, size_t size)
{
    for (int i = 0; i < size; ++i)
        std::cout << "i " << static_cast<int>(aT[i]) << "\n";
}
 
int main()
{
    T t;
    show(static_cast<char*>(static_cast<void*>(&t)), sizeof(t));
    system("pause>nul");
}
Добавлено через 33 секунды
Цитата Сообщение от _Ivana Посмотреть сообщение
packed - прагму
Простите, но... Энто што?..
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
30.11.2016, 16:21 11
Это я так называю любые волшебные мутаборы, которые могут указать компилятору определенное поведение, например ужимать/паковать поля структур для уменьшения размера памяти или транжирить байты ради скорости доступа.
0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
30.11.2016, 16:21  [ТС] 12
_Ivana, кажется, оно само это делает...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct T
{
    char i = 0;
    char j = 0;
    char g = 0;
    char h = 0;
    int a = 66;
    int b = 77;
};
 
void show(const char* aT, size_t size)
{
    for (int i = 0; i < size; ++i)
        std::cout << "i " << static_cast<int>(aT[i]) << "\n";
}
 
int main()
{
    T t;
    show(static_cast<char*>(static_cast<void*>(&t)), sizeof(t));
    system("pause>nul");
}
Вы ведь это имели в виду?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
30.11.2016, 16:22 13
Цитата Сообщение от Тамика Посмотреть сообщение
Энто што?
Энто вот: https://msdn.microsoft.com/ru-... 0t5y1.aspx
2
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 30
30.11.2016, 16:25 14
Цитата Сообщение от Тамика Посмотреть сообщение
_Ivana, кажется, оно само это делает...
Значит у вас или по-умолчанию включены эти мутаборы, или это безмутаборное поведение по-умолчанию вообще Можно или копаться в этом, или забить. Но если забивать - то ни в коем случае не ковырять память выделенную под структуру по перекастованным указателям на чары, ожидая, что данные будут лежать вплотную

ЗЫ Как только мы ушли от ручного ассемблера к компиляторам, мы потеряли 2 важных вещи - управление временем выполнения и размещением данных в памяти. Променяли это на остальные плюшки и постепенно теряем контроль, передавая его искусственному интеллекту
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
30.11.2016, 16:30 15
Цитата Сообщение от Тамика Посмотреть сообщение
кажется, оно само это делает...
Не оно само, а ты сама
Ты же сама расположила данные в структуре в оптимальном (для твоей платформы) порядке.
А отключение выравнивания - это другое, это если ты данные расположила не в оптимальном порядке, но выравнивать компилятор их все равно не будет. Этим обычно пользуются для формирования всякого разного рода пакетов или заголовков, предназначенных для передачи по сети, записи в файлы и т.п. Есть и обратная сторона медали - прямой доступ к невыравненным данным обычно медленее, а на некоторых аппаратных платформах в принципе невозможен (будет аппаратное исключение). Поэтому лучше этим не баловаться без нужды
1
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
30.11.2016, 16:34  [ТС] 16
DrOffset, а я пробовала и с трёмя чариками, и с двумя, и с одним.

А вот такая штука опять меня запутала... Почему если инт первый, то под чар выделяется 4 байта. Если чар один и первый - 1 байт?.. Расположение на позицию кратную 4 тут не котируется, потому что инт первый.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct T1
{
    int c = 88;
    char j = 0;
};
 
struct T2
{
    char i = 0;
};
 
void show(const char* aT, size_t size)
{
    std::cout << "\nNEW\n";
    for (int i = 0; i < size; ++i)
        std::cout << i << " " << static_cast<int>(aT[i]) << "\n";
}
 
int main()
{
    T1 t1;
    T2 t2;
    show(static_cast<char*>(static_cast<void*>(&t1)), sizeof(t1));
    show(static_cast<char*>(static_cast<void*>(&t2)), sizeof(t2));
    system("pause>nul");
}
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
30.11.2016, 16:57 17
Цитата Сообщение от Тамика Посмотреть сообщение
А вот такая штука опять меня запутала... Почему если инт первый, то под чар выделяется 4 байта. Если чар один и первый - 1 байт?.. Расположение на позицию кратную 4 тут не котируется, потому что инт первый
Потому что выравнивание зависит от типа, а относится к адресу.
Может быть проще будет пользоваться вот таким более строгим определением:
Адреса всех данных размером 2n байт при n >= размеру машинного слова должны делиться на 2(размер машинного слова).

Добавлено через 4 минуты
Тамика, вот хороший материал по теме: http://konishchevdmitry.blogsp... -post.html
1
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
30.11.2016, 17:01  [ТС] 18
DrOffset, получается, у меня машинное слово это 4?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
30.11.2016, 17:04 19
Цитата Сообщение от Тамика Посмотреть сообщение
у меня машинное слово это 4?
Да.
1
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
30.11.2016, 17:05  [ТС] 20
DrOffset, спасиииибо
0
30.11.2016, 17:05
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.11.2016, 17:05
Помогаю со студенческими работами здесь

Определить размер структуры
Здравствуйте. Как определить размер структуры без использования функции sizeof()?

Размер структуры с битовыми полями
Здравствуйте, имеется структура с битовыми полями (используя директиву #pragma pack (push,1)):...

Увеличить указатель на размер адресуемой им структуры
Помогите написать программу : Увеличить указатель на размер адресуемой им структуры

Как определить размер структуры и объединения?
всем привет :) typedef union{ float Float; short int Logic; short int...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Обработка числовой информации
hw_wired 28.01.2025
Введение в обработку числовой информации В современном мире обработка числовой информации стала неотъемлемой частью как профессиональной деятельности, так и повседневной жизни. Электронные таблицы. . .
Мультимедиа
hw_wired 28.01.2025
Введение в мультимедийные технологии В современном мире мультимедийные технологии стали неотъемлемой частью нашей жизни, проникнув во все сферы человеческой деятельности. Термин "мультимедиа". . .
Обработка текстовой информации
hw_wired 28.01.2025
Введение в обработку текстовой информации В современном мире обработка текстовой информации играет фундаментальную роль в различных сферах человеческой деятельности. Текстовые редакторы стали. . .
Обработка графической информации
hw_wired 28.01.2025
Введение в компьютерную графику Компьютерная графика стала неотъемлемой частью современного цифрового мира, пройдя впечатляющий путь развития от простейших черно-белых изображений до сложных. . .
Python в Алгоритмике: Решение задач
hw_wired 28.01.2025
Введение в Python и Алгоритмику В современном мире программирование стало неотъемлемой частью образования и профессионального развития. Python зарекомендовал себя как один из самых популярных и. . .
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
Информационное моделирование
hw_wired 28.01.2025
Введение в информационное моделирование В современном мире информационное моделирование стало неотъемлемой частью научной, образовательной и профессиональной деятельности. Это мощный инструмент. . .
Объекты и их имена
hw_wired 28.01.2025
Введение: Основы объектного подхода и их роль в информатике В современном мире информационных технологий объектный подход стал фундаментальным принципом организации и обработки информации. Этот. . .
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru