Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2014, 16:17   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Здравствуйте.
Код:
struct S
{
    char a;
    char b;
};
Верно ли утверждение что на всех системах &a < &b ?

Наверное нет, насколько известно в dos'е стек рос в другую сторону?

И более важный вопрос: если направление роста адресов может разниться, будут ли корректно работать (на разных системах) алгоритмы работающие с адресами напрямую (+, -, <, >)? Или операторы меняют поведение в зависимости от системы?

Думаю я нашел ответ.
В <iterator> в описании про std::advance() следующее:
Код:
template <class InputIterator, class Distance>
  void advance (InputIterator& it, Distance n);
Advance iterator

Advances the iterator it by n element positions.

 If it is a random-access iterator, the function uses just once operator+ or operator-. Otherwise, 
the function uses repeatedly the increase or decrease operator (operator++ or operator--) until n elements have been advanced.
Поэтому, прямой инкремент/декремент указателей видимо лучше избегать.

P.s.
std::advance не показатель (может сдвигать в обе стороны)

Последний раз редактировалось Stilet; 06.02.2014 в 17:29.
220Volt вне форума Ответить с цитированием
Старый 06.02.2014, 17:11   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
Верно ли утверждение что на всех системах &a < &b ?
Все зависит от платформы, на которой компилируется данный код и компилятора. Может случиться ситуация, когда у вас есть следующий код

Код:
struct S
{
    char a;
    char b;
};

S obj;
obj.a = '1';
obj.b = '1';
При одинаковых значениях обоих полей (которые не меняются на протяжении всей программы), компилятор может оптимизировать код таким образом, что данные будут лежать по адресу, к примеру 0x0000FFCA, а обе ссылки будут указывать на этот адрес. Получится, что &a == &b
MaTBeu вне форума Ответить с цитированием
Старый 06.02.2014, 17:11   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

куча бреда.

в ДОСе стек рос так же, рост стека вообще от ОС не зависит.

операторы не меняют значения, адрес есть число, их и сравнивает.

std::advance вообще к этому отношения не причем, да и вывод бред.

на интеловской платформе стек всегда растет в одну сторону.
а на иных вы врятли будете работать.
да и там стек растет так же, и объекты расположены линейно

Цитата:
Получится, что &a == &b
поидее только при битовых полях, не иначе.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.02.2014, 17:29   #4
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
куча бреда.

в ДОСе стек рос так же, рост стека вообще от ОС не зависит.

операторы не меняют значения, адрес есть число, их и сравнивает.

std::advance вообще к этому отношения не причем, да и вывод бред.

на интеловской платформе стек всегда растет в одну сторону.
а на иных вы врятли будете работать.
да и там стек растет так же, и объекты расположены линейно

поидее только при битовых полях, не иначе.
Я лично читал о том, как при переполнении стека в dos затирается область инструкций, не могу сейчас найти ссылку, тем более попробовать.

Прежде чем говорить что std::advance бред, попробуйте туда указатель передать (и смежные с ним функции prev, next).

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Все зависит от платформы, на которой компилируется данный код и компилятора. Может случиться ситуация, когда у вас есть следующий код

Код:
struct S
{
    char a;
    char b;
};

S obj;
obj.a = '1';
obj.b = '1';
При одинаковых значениях обоих полей (которые не меняются на протяжении всей программы), компилятор может оптимизировать код таким образом, что данные будут лежать по адресу, к примеру 0x0000FFCA, а обе ссылки будут указывать на этот адрес. Получится, что &a == &b
Не согласен, думаю если бы компилятор делал такие оптимизации был бы ужас.

Последний раз редактировалось MaTBeu; 06.02.2014 в 17:42.
220Volt вне форума Ответить с цитированием
Старый 06.02.2014, 17:42   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Не согласен, думаю если бы компилятор делал такие оптимизации был бы ужас.
Никакого ужаса, зачем выделять память под 2 объекта, если значение одно и тоже (константное) на протяжении всей программы?

По поводу std::advance - мне кажется вы неправильно понимаете. Как вы проверяете, что итератор переместился?
MaTBeu вне форума Ответить с цитированием
Старый 06.02.2014, 18:01   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Я лично читал о том, как при переполнении стека в dos затирается область инструкций, не могу сейчас найти ссылку, тем более попробовать.
стек там растет так же, в сторону уменьшения адресов.

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

Цитата:
Никакого ужаса, зачем выделять память под 2 объекта, если значение одно и тоже (константное) на протяжении всей программы?
тогда обычно вообще убирается объект, но его структуру он не меняет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.02.2014, 21:33   #7
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Смотрим в стандарт. Раздел 9.2, параграф 13:
Цитата:
Nonstatic data members of a (non-union) class with the same access control (Clause 11) are allocated so
that later members have higher addresses within a class object. The order of allocation of non-static data
members with different access control is unspecified (Clause 11). Implementation alignment requirements
might cause two adjacent members not to be allocated immediately after each other; so might requirements
for space for managing virtual functions (10.3) and virtual base classes (10.1).
Son Of Pain вне форума Ответить с цитированием
Старый 06.02.2014, 22:22   #8
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Большое спасибо, это вносит ясность.
Код:
...The order of allocation of non-static data
members with different access control is unspecified ...
А вот это меня очень удивило, даже не подозревал.
220Volt вне форума Ответить с цитированием
Старый 07.02.2014, 18:13   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Здравствуйте.
Код:
struct S
{
    char a;
    char b;
};
Верно ли утверждение что на всех системах &a < &b ?
Да.

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Наверное нет, насколько известно в dos'е стек рос в другую сторону?
Это не принципиально. Это трудности компилятора, как он будет разруливать адреса.

Вы имеете полное право рассчитывать на то, что:
адрес массива всегда совпадает с адресом первого элемента массива.
адрес второго массива - это адрес первого + смещение равное sizeof(a[0])

и тд.

Каким бы ни был механизм стека, камень процессора и тп, компилятор вам гарантирует четкую определенность следования элементов и их адресов.

Структуры: struct example { int a,b; };
Так же являются непрерывными блоками памяти, которые хранят элементы.

Структуры можно рассматривать как массивы, способные хранить элементы разных типов.

В плане адресации самих элементов - аналогично с массивами: зная адрес начала объекта структуры, и точные типы её членов, вы сможете итерироваться по указателю на данные этих членов.
_Bers вне форума Ответить с цитированием
Старый 07.02.2014, 21:59   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
зная адрес начала объекта структуры, и точные типы её членов, вы сможете итерироваться по указателю на данные этих членов.
Не факт, есть еще выравнивание...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическое заполнение ячеек в разных системах счисления viron Microsoft Office Excel 3 09.01.2012 19:28
программа выполнения арифметических операций в разных системах счисления Iraida555 Помощь студентам 2 28.12.2011 11:27
Рисование в разных системах координат Marsel737 Общие вопросы Delphi 0 07.06.2011 19:18
Представление чисел в разных системах счисления Slavytich Помощь студентам 2 03.04.2011 11:55