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

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

Войти
Регистрация
Восстановить пароль
 
Renji
2117 / 1476 / 347
Регистрация: 05.06.2014
Сообщений: 4,300
#1

Расположение полей структуры в памяти - C++

27.04.2017, 20:25. Просмотров 265. Ответов 13
Метки нет (Все метки)

Есть структура MyStruct содержащая в себе два поля int. Есть массив объектов MyStruct. Гарантируется ли что поля MyStruct будут расположены в памяти также, как если бы это был массив int?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct MyStruct
{
    int a,b;
};
 
int main()
{
    MyStruct array[]={{1,2},{3,4}};
    int*intArray=reinterpret_cast<int*>(array);
    //это всегда будет печатать "1 2 3 4" или в зависимости от компилятора?
    for(int i=0;i<4;++i)
        std::cout<<intArray[i]<<" "l;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2017, 20:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Расположение полей структуры в памяти (C++):

Расположение полей структуры в памяти - C++
Нифига себе на что плюсы способны... #include &quot;stdafx.h&quot; #include &lt;time.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; using...

Расположение переменных в памяти - C++
int x; int y; int f; cout&lt;&lt;&amp;x&lt;&lt;' '&lt;&lt;&amp;f; f идет после x(x-&gt;f) int x; int y; int f;

Расположение переменных в памяти - C++
Было в Эккеле вот такое вот упражнение : &quot;Определить подряд два массива типа int. Сместить индекс от конца первого массива в начало...

Структуры, нумерация полей структуры - C++
Добрый день, у меня есть задачка, она решена. Но меня попросили &quot;предусмотреть нумерацию полей структуры, например 1)Имя:Петр и тд.&quot;....

Целые числа и расположение их в памяти - C++
Наткнулся тут на один интересный момент. Допустим у нас есть переменная - слово (WORD), равная, например, 45221. Всегда считал, что числа...

Смещение полей структуры - C++
Как можно узнать смещение поля структуры относительно адреса структуры? Если просто сложить размеры предыдущих элементов, то результат...

13
nmcf
6206 / 5517 / 1932
Регистрация: 14.04.2014
Сообщений: 23,155
27.04.2017, 21:46 #2
Скорее нет. Надо как минимум запретить выравнивание.
1
Renji
2117 / 1476 / 347
Регистрация: 05.06.2014
Сообщений: 4,300
27.04.2017, 23:00  [ТС] #3
Цитата Сообщение от nmcf Посмотреть сообщение
Скорее нет. Надо как минимум запретить выравнивание.
Тут как раз и возникает непонятка - я не вижу ни одной причины по которой выравнивание двух полей int в структуре, должно отличаться от выравнивания тех же самых двух int в массиве. С другой стороны я не уверен что компилятор не имеет права сделать разное выравнивание просто потому что ему этого никто не запрещал.
0
Saqr
58 / 14 / 3
Регистрация: 07.04.2017
Сообщений: 58
27.04.2017, 23:37 #4
Цитата Сообщение от Renji Посмотреть сообщение
я не вижу ни одной причины по которой выравнивание двух полей int в структуре, должно отличаться от выравнивания тех же самых двух int в массиве.
ее и нету. с чего бы она была.
1
Evg
Эксперт CАвтор FAQ
18913 / 6872 / 503
Регистрация: 30.03.2009
Сообщений: 19,348
Записей в блоге: 30
27.04.2017, 23:47 #5
Цитата Сообщение от Renji Посмотреть сообщение
Тут как раз и возникает непонятка - я не вижу ни одной причины по которой выравнивание двух полей int в структуре, должно отличаться от выравнивания тех же самых двух int в массиве. С другой стороны я не уверен что компилятор не имеет права сделать разное выравнивание просто потому что ему этого никто не запрещал.
Де-факто два int'а в структуре на всех вменяемых архитектурах будут лежать в памяти так же, как и два int'а. Де-юре распределение int'ов в массиве регламентируется стандартом языка, а расположение полей в структуре регламентируется программными соглашениями конкретной архитектуры. Просто конкретно для структуры, состоящей из полей одинакового типа эти два разных закона дадут одинаковое расположение в памяти
1
Saqr
58 / 14 / 3
Регистрация: 07.04.2017
Сообщений: 58
28.04.2017, 01:26 #6
Цитата Сообщение от Evg Посмотреть сообщение
распределение int'ов в массиве регламентируется стандартом языка
не стандартом, а определением. или стандарт теперь определяет размер int'a?
0
Renji
2117 / 1476 / 347
Регистрация: 05.06.2014
Сообщений: 4,300
28.04.2017, 01:31  [ТС] #7
Цитата Сообщение от Saqr Посмотреть сообщение
не стандартом, а определением. или стандарт теперь определяет размер int'a?
Дык и в MyStruct, и в массиве размер int одинаковый.
0
hoggy
6860 / 3067 / 525
Регистрация: 15.11.2014
Сообщений: 6,961
Завершенные тесты: 1
28.04.2017, 01:49 #8
Цитата Сообщение от Renji Посмотреть сообщение
Гарантируется ли что поля MyStruct будут расположены в памяти также, как если бы это был массив int?
нет.
0
Evg
Эксперт CАвтор FAQ
18913 / 6872 / 503
Регистрация: 30.03.2009
Сообщений: 19,348
Записей в блоге: 30
28.04.2017, 10:09 #9
Цитата Сообщение от Saqr Посмотреть сообщение
не стандартом, а определением. или стандарт теперь определяет размер int'a?
В этой теме речь вообще не идёт о размере int'а. Речь идёт о взаимном расположении этих int'ов друг относительно друга
0
Saqr
58 / 14 / 3
Регистрация: 07.04.2017
Сообщений: 58
28.04.2017, 11:02 #10
Цитата Сообщение от Evg Посмотреть сообщение
Речь идёт о взаимном расположении этих int'ов друг относительно друга
а в стандарте есть хоть слово об этом? можно вырезку?
вот, что я могу привести
An alignment is an implementation-defined integer value representing
the number of bytes between successive addresses at which a given object can be allocated.
или массив - это объект и о выравнивании его элементов написано?
0
Croessmah
Ушел
13777 / 8027 / 927
Регистрация: 27.09.2012
Сообщений: 19,784
Записей в блоге: 3
Завершенные тесты: 1
28.04.2017, 11:03 #11
C++
1
static_assert(sizeof(MyStruct) == sizeof(int) * 2, "unexpected padding in MyStruct");
C++
1
static_assert(offsetof(MyStruct, b) == sizeof(MyStruct::a), "unexpected padding  in MyStruct");
0
MrGluck
Модератор
Эксперт CЭксперт С++
7800 / 4844 / 754
Регистрация: 29.11.2010
Сообщений: 13,212
28.04.2017, 11:25 #12
Цитата Сообщение от Renji Посмотреть сообщение
Гарантируется ли что поля MyStruct будут расположены в памяти также, как если бы это был массив int?
Нет, надо принять во внимание выравнивании полей в структуре.
0
Evg
Эксперт CАвтор FAQ
18913 / 6872 / 503
Регистрация: 30.03.2009
Сообщений: 19,348
Записей в блоге: 30
28.04.2017, 13:02 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Saqr Посмотреть сообщение
а в стандарте есть хоть слово об этом? можно вырезку?
У меня нет под рукой стандарта

Цитата Сообщение от Saqr Посмотреть сообщение
вот, что я могу привести
К выравниванию это не имеет вообще никакого отношения

Элементы массива должны вплотную лежать друг за другом. Тупо потому, что без этого поинтерная арифметика работать не будет. Т.е. если у нас в указателе p записан адрес 5-го элемента массива, то указатель p+1 должен указывать на 6-й элемент массива

Как располагаются поля в структуре - скорее всего описано как implementation defined. В любом случае если указатель p указывает на 3-е (в колхозно-бытовом понятии) поле структуры, то из стандарта никак не следует, что p+1 будет указывать на 4-е поле структуры

Добавлено через 53 секунды
Цитата Сообщение от MrGluck Посмотреть сообщение
Нет, надо принять во внимание выравнивании полей в структуре.
Чего и как принимать во внимание внутри структуры, вытекает из программных соглашений, а не из стандарта

Добавлено через 8 минут
Точнее не так. По стандарту каждое из полей структуры должно быть выровнено на размер выравнивания типа поля. Но какие при этом могут возникнуть дырки, не сказано. Т.е. структура, состоящая из двух int'ов вполне может иметь размер 16, выравнивание 4, данные будут располагаться в порядке: первое поле, 4 байта дырка, второе поле, 4 байта дырка. Если на каком-нибудь маргинальном процессоре сделают такое программное соглашение, то оно не будет противоречить стандарту
1
avgoor
967 / 601 / 130
Регистрация: 05.12.2015
Сообщений: 1,686
28.04.2017, 19:19 #14
Цитата Сообщение от Saqr Посмотреть сообщение
а в стандарте есть хоть слово об этом? можно вырезку?
8.3.4.1
An object of array type contains a contiguously allocated non-empty
set of N subobjects of type T
1
28.04.2017, 19:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2017, 19:19
Привет! Вот еще темы с ответами:

Заполнение полей структуры - C++
Нужна ваша помощь! Нужно считать файл и записать в массив. Потом из этого массива надо раскидать значения по полям структуры. Как это...

Заполнение полей структуры - C++
Подскажите, в чем ошибка. #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; struct sign { char Lastname; char Firstname; char...

Инициализация полей структуры из файла - C++
Помогите, пожалуйста, разобраться с файлами. Имеется такая структура: enum Pos {director = 1, manager, bookkeeper, secretary,...

Изменить одно из полей структуры - C++
Пользователь вводит с клавиатуры день рождения(напр 15) Внутри структуры изменить 15 на 1.И далее вывести на экран.


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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