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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
_kod_
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
#1

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

22.08.2012, 08:49. Просмотров 2198. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2012, 08:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение памяти под структуры (C++):

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

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

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

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

Выделение памяти под структуру - C++
Наведите пример выделения памяти под структуру

Выделение памяти под строку - C++
Никак не могу понять, в чем проблема, подскажите пожалуйста. Предположим, инициализирую переменную, ожидая получить строку из 10...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Пaтрик
415 / 390 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
22.08.2012, 08:55 #2
Тип char, int, double не трубуют выравнивания сами по себе. Выравниевание нужно в структурах/объединениях.
0
_kod_
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
22.08.2012, 09:16  [ТС] #3
Ну так я спрашиваю - вот структура у меня получилась 16 байт... Откуда лишние байты взялись? Как она в памяти расположилась? Че там выравнивалось Я понимаю, что char, int, double не нужно отдельно выравнивать... А вот что с ними в структуре происходит? Откуда эти 16 байт берутся...
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
22.08.2012, 09:24 #4
Размер слова на Вашей машине равен 4 байтам. 4 + 4 + 8 = 16.
0
_kod_
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
22.08.2012, 09:26  [ТС] #5
оО Как? DWORD - это же double word(двойное слово). Ну и значит просто WORD - 2 байта Я не прав?
0
Пaтрик
415 / 390 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
22.08.2012, 09:27 #6
http://habrahabr.ru/post/90580/
0
ValeryS
Модератор
6634 / 5041 / 466
Регистрация: 14.02.2011
Сообщений: 16,852
22.08.2012, 09:31 #7
Цитата Сообщение от _kod_ Посмотреть сообщение
Ну так я спрашиваю - вот структура у меня получилась 16 байт... Откуда лишние байты взялись?
Цитата Сообщение от _kod_ Посмотреть сообщение
(слово имеет длину 2 байта для машин серии IBM PC AT /286/287),
ты все еще на 286???
начиная с 386
выравнивание равно 4 байтам(если иное не указано в настройках компилятора)

Добавлено через 1 минуту
Цитата Сообщение от _kod_ Посмотреть сообщение
оО Как? DWORD - это же double word(двойное слово). Ну и значит просто WORD - 2 байта
да
но С не знает что такое DWORD и WORD( это ассемблер)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2012, 09:31
Привет! Вот еще темы с ответами:

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

Выделение памяти под масссив - C++
Как занести данные в двумерный массив с клавиатуры? пользователь должен сам ввести размерность

Выделение памяти под файл - C++
Всем доброго времени суток. Написал некоторую структуру, работают все пунктики, все функции, но нашёлся недочёт. Если записывать в файл...

Выделение памяти под переменную - C++
Драсте, уважаемые. Мне надо выделить переменную на 25мег, чтоб в ней хранить все просчёты выполненые программой. (Пробовал в BCB6 и в BCW...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.08.2012, 09:31
Ответ Создать тему
Опции темы

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