Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/35: Рейтинг темы: голосов - 35, средняя оценка - 4.74
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84

Выделение памяти под структуры

22.08.2012, 08:49. Показов 6833. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Когда я только знакомился с кодингом на С(С++) я скачивал с инета очень много всякой литературы... Так вот... Недавно я начал заново перечитывать эти книжки(статьи), хотел проверить насколько я продвинулся. (лол че...) Наткнулся на такую вот инфу:

Когда sizeof применяются к имени типа структуры или объединения или к идентификатору имеющему тип структуры или объединения, то результатом является фактический размер структуры или объединения, который может включать участки памяти, используемые для выравнивания элементов структуры или объединения. Таким образом, этот результат может не соответствовать размеру, получаемому путем сложения размеров элементов структуры.
Ну автор привел пример:
C
1
2
3
4
5
6
 struct     { char   h;
                   int    b;
                   double f;
                 } str;
      int a1;
      a1  = sizeof(str);
После чего автор говорит:
Переменная а1 получит значение, равное 12, в то же время если сложить длины всех используемых в структуре типов, то получим, что длина структуры str равна 7.

Несоответствие имеет место в виду того, что после размещения в памяти первой переменной h длинной 1 байт, добавляется 1 байт для выравнивания адреса переменной b на границу слова (слово имеет длину 2 байта для машин серии IBM PC AT /286/287), далее осуществляется выравнивание адреса переменной f на границу двойного слова (4 байта), таким образом в результате операций выравнивания для размещения структуры в оперативной памяти требуется на 5 байт больше.

В связи с этим целесообразно рекомендовать при объявлении структур и объединения располагать их элементы в порядке убывания длины типов.
Ну я как тру-кодер решил проверить на своей машине
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
#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
 
struct { 
    char   h;
    int    b;
    double f;
       } str;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a1;
 
    printf("size DWORD: %d \n", sizeof(DWORD)); //Следовательно, размер слова - 2 байта (быдло. че еще сказать... по другому не судьба определить)
    printf("size char: %d \n",sizeof(char));
    printf("size int: %d \n",sizeof(int));
    printf("size double: %d \n",sizeof(double));
    printf("size struct: %d \n",sizeof(str));
 
    system("pause");
    return 0;
}
Получил вот такое вот:


Компилятор, как вы поняли - Майкрософтовский (Вижуал студио)... Поясните что это за байда с выраниванием.... И например у меня тип double 8 байт, размер слова - 2 байта... 8/2 = 4 (ровно 4 слова, мы же как раз поместились... ) или тип int 4 байта, тоже влезли в 2 слова... Получается никакого выравнивания не должно быть. Только тип char - 1 байт(его выравнили до 2 байт)...
Итогодебит, кредит епт...)
2+4+8 = 14(а она 16 байт)
Что я упустил?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.08.2012, 08:49
Ответы с готовыми решениями:

Структуры выделение динамической памяти под массивы
Здравствуйте, Мне нужно создать массив из элементов структуры, и использовать для этого динамическую память,подскажите пожалуйста, в чем...

Структуры и динамическое выделение памяти.
Привет, нужна помощь: есть написанная программа, которая работает со структурами, эту программу надо переписать так, чтобы она использовала...

Структуры. Динамическое выделение памяти
Добрый день! Хочу задать следующий вопрос: typedef struct name { char *name; char *surename; } NAME; void main () { ...

6
 Аватар для Пaтрик
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 976
22.08.2012, 08:55
Тип char, int, double не трубуют выравнивания сами по себе. Выравниевание нужно в структурах/объединениях.
0
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
22.08.2012, 09:16  [ТС]
Ну так я спрашиваю - вот структура у меня получилась 16 байт... Откуда лишние байты взялись? Как она в памяти расположилась? Че там выравнивалось Я понимаю, что char, int, double не нужно отдельно выравнивать... А вот что с ними в структуре происходит? Откуда эти 16 байт берутся...
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
22.08.2012, 09:24
Размер слова на Вашей машине равен 4 байтам. 4 + 4 + 8 = 16.
0
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
22.08.2012, 09:26  [ТС]
оО Как? DWORD - это же double word(двойное слово). Ну и значит просто WORD - 2 байта Я не прав?
0
 Аватар для Пaтрик
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 976
22.08.2012, 09:27
http://habrahabr.ru/post/90580/
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
22.08.2012, 09:31
Цитата Сообщение от _kod_ Посмотреть сообщение
Ну так я спрашиваю - вот структура у меня получилась 16 байт... Откуда лишние байты взялись?
Цитата Сообщение от _kod_ Посмотреть сообщение
(слово имеет длину 2 байта для машин серии IBM PC AT /286/287),
ты все еще на 286???
начиная с 386
выравнивание равно 4 байтам(если иное не указано в настройках компилятора)

Добавлено через 1 минуту
Цитата Сообщение от _kod_ Посмотреть сообщение
оО Как? DWORD - это же double word(двойное слово). Ну и значит просто WORD - 2 байта
да
но С не знает что такое DWORD и WORD( это ассемблер)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.08.2012, 09:31
Помогаю со студенческими работами здесь

Создайте динамическое выделение памяти в структуры
Есть код, нужно сделать динамическое выделение памяти в нем. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt;...

Динамическое выделение памяти для структуры в функции
Объясните не могу понять. На С++ пишу совсем недавно. Суть вопроса, при первом запуске программы происходит проверка на существование...

Выделение памяти под массив
Требуется выделить память под матрицу. Будет ли следующий код работать корректно? //глобальная область int x_size = 3; ...

Выделение памяти под матрицу
Всем доброго времени суток! Есть такая проблема, у меня есть свой класс Cell. Мне нужно создать матрицу объектов этого типа и выделить под...

Выделение памяти под матрицу
Существует такой класс: class matr{ public: double **m; // адрес матрицы int mi, my; //стобцы, строки //функции ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru