Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Renji
2162 / 1521 / 463
Регистрация: 05.06.2014
Сообщений: 4,405
#1

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

27.04.2017, 20:25. Просмотров 880. Ответов 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
Ответы с готовыми решениями:

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

Расположение в памяти полей и методов класса
помогите пожалуйста с вопросом: расположение в памяти полей и методов класса

Структуры, нумерация полей структуры
Добрый день, у меня есть задачка, она решена. Но меня попросили &quot;предусмотреть...

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

Расположение переменных в памяти
Было в Эккеле вот такое вот упражнение : &quot;Определить подряд два массива типа...

13
nmcf
6260 / 5572 / 2532
Регистрация: 14.04.2014
Сообщений: 23,464
27.04.2017, 21:46 #2
Скорее нет. Надо как минимум запретить выравнивание.
1
Renji
2162 / 1521 / 463
Регистрация: 05.06.2014
Сообщений: 4,405
27.04.2017, 23:00  [ТС] #3
Цитата Сообщение от nmcf Посмотреть сообщение
Скорее нет. Надо как минимум запретить выравнивание.
Тут как раз и возникает непонятка - я не вижу ни одной причины по которой выравнивание двух полей int в структуре, должно отличаться от выравнивания тех же самых двух int в массиве. С другой стороны я не уверен что компилятор не имеет права сделать разное выравнивание просто потому что ему этого никто не запрещал.
0
Saqr
58 / 14 / 5
Регистрация: 07.04.2017
Сообщений: 58
27.04.2017, 23:37 #4
Цитата Сообщение от Renji Посмотреть сообщение
я не вижу ни одной причины по которой выравнивание двух полей int в структуре, должно отличаться от выравнивания тех же самых двух int в массиве.
ее и нету. с чего бы она была.
1
Evg
Эксперт CАвтор FAQ
19134 / 6978 / 522
Регистрация: 30.03.2009
Сообщений: 19,628
Записей в блоге: 30
27.04.2017, 23:47 #5
Цитата Сообщение от Renji Посмотреть сообщение
Тут как раз и возникает непонятка - я не вижу ни одной причины по которой выравнивание двух полей int в структуре, должно отличаться от выравнивания тех же самых двух int в массиве. С другой стороны я не уверен что компилятор не имеет права сделать разное выравнивание просто потому что ему этого никто не запрещал.
Де-факто два int'а в структуре на всех вменяемых архитектурах будут лежать в памяти так же, как и два int'а. Де-юре распределение int'ов в массиве регламентируется стандартом языка, а расположение полей в структуре регламентируется программными соглашениями конкретной архитектуры. Просто конкретно для структуры, состоящей из полей одинакового типа эти два разных закона дадут одинаковое расположение в памяти
1
Saqr
58 / 14 / 5
Регистрация: 07.04.2017
Сообщений: 58
28.04.2017, 01:26 #6
Цитата Сообщение от Evg Посмотреть сообщение
распределение int'ов в массиве регламентируется стандартом языка
не стандартом, а определением. или стандарт теперь определяет размер int'a?
0
Renji
2162 / 1521 / 463
Регистрация: 05.06.2014
Сообщений: 4,405
28.04.2017, 01:31  [ТС] #7
Цитата Сообщение от Saqr Посмотреть сообщение
не стандартом, а определением. или стандарт теперь определяет размер int'a?
Дык и в MyStruct, и в массиве размер int одинаковый.
0
hoggy
Заблокирован
28.04.2017, 01:49 #8
Цитата Сообщение от Renji Посмотреть сообщение
Гарантируется ли что поля MyStruct будут расположены в памяти также, как если бы это был массив int?
нет.
0
Evg
Эксперт CАвтор FAQ
19134 / 6978 / 522
Регистрация: 30.03.2009
Сообщений: 19,628
Записей в блоге: 30
28.04.2017, 10:09 #9
Цитата Сообщение от Saqr Посмотреть сообщение
не стандартом, а определением. или стандарт теперь определяет размер int'a?
В этой теме речь вообще не идёт о размере int'а. Речь идёт о взаимном расположении этих int'ов друг относительно друга
0
Saqr
58 / 14 / 5
Регистрация: 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
++Ͻ
14377 / 8159 / 1534
Регистрация: 27.09.2012
Сообщений: 20,107
Записей в блоге: 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Эксперт С++
8054 / 4898 / 1426
Регистрация: 29.11.2010
Сообщений: 13,297
28.04.2017, 11:25 #12
Цитата Сообщение от Renji Посмотреть сообщение
Гарантируется ли что поля MyStruct будут расположены в памяти также, как если бы это был массив int?
Нет, надо принять во внимание выравнивании полей в структуре.
0
Evg
Эксперт CАвтор FAQ
19134 / 6978 / 522
Регистрация: 30.03.2009
Сообщений: 19,628
Записей в блоге: 30
28.04.2017, 13:02 #13
Лучший ответ Сообщение было отмечено Renji как решение

Решение

Цитата Сообщение от Saqr Посмотреть сообщение
а в стандарте есть хоть слово об этом? можно вырезку?
У меня нет под рукой стандарта

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

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

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

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

Добавлено через 8 минут
Точнее не так. По стандарту каждое из полей структуры должно быть выровнено на размер выравнивания типа поля. Но какие при этом могут возникнуть дырки, не сказано. Т.е. структура, состоящая из двух int'ов вполне может иметь размер 16, выравнивание 4, данные будут располагаться в порядке: первое поле, 4 байта дырка, второе поле, 4 байта дырка. Если на каком-нибудь маргинальном процессоре сделают такое программное соглашение, то оно не будет противоречить стандарту
1
avgoor
1008 / 602 / 157
Регистрация: 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

Целые числа и расположение их в памяти
Наткнулся тут на один интересный момент. Допустим у нас есть переменная - слово...

Сортировка полей структуры
Здравствуйте! У меня следующий вопрос: Допустим, у меня есть структура: ...

Смещение полей структуры
Как можно узнать смещение поля структуры относительно адреса структуры? Если...


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

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

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