Здравствуйте, Nortsx, Вы писали:
N>Здравствуйте, Edain, Вы писали:
E>>Здравствуйте, Nortsx, Вы писали:
N>>>Что означает зщапись например int& i = какому нить другмоу инту. N>>>Это ссылка, но какую функциональность может она нести, если для взятия ссылки от объекта достаточно &имя. N>>>Вот правда не понимаю
E>>Ссылки полезно использовать в качестве формальных аргументов функций, чтобы избежать копирования этих самых аргументов. Также я иногда использую ссылки в циклах по контейнерам исключительно в эстетических целях, чтобы не использовать итераторы. Например,
E>>
E>>Не знаю, насколько это снижает производительность цикла, не мерял.
E>>А вообще, да, это базовые вещи, которые отлично разъяснены во всех учебниках.
Сорри,отправил пустое сообщение.
Как раз такой вопрос у меня и возник после прочтения учебника)
Он звучит не как "зачем нужны ссылки", а как "зачем ссылкам псевдонимы".
Ну я жуе увидел примеры использования, когда улучшается ридабилити кода и т д.
N> char a = 'a';
N> char b = 'b';
N> char c;
N> char d;
N> char e;
N> char* ptr = &a;
N> c = *ptr++;
N> d = *ptr--;
N>
N>После выполнения указаных действий c равно значению а, а d — указывают на пустую область памяти. Почему?
У меня два варианта:
1) компилятор выделяет каждой переменной два байта,- т.е. выравнивает на границу слова.
2) компилятор оптимизирует код и не выделяет переменным память
On 01/26/2012 02:17 PM, wisp wrote:
> N> char a = 'a'; > N> char b = 'b'; > N> char c; > N> char d; > N> char e; > N> char* ptr =&a; > N> c = *ptr++; > N> d = *ptr--; > N> > > > > N>После выполнения указаных действий c равно значению а, а d — указывают на > пустую область памяти. Почему?
d -- char d;, он никуда указывать не может.
> У меня два варианта: > 1) компилятор выделяет каждой переменной два байта,- т.е. выравнивает на границу > слова.
Это может быть, но это -- проблемы компилятора.
А твоего кода пролемы, что в этой строке:
d = *ptr--;
ты адресуешся по адресу несуществующей переменной.
> 2) компилятор оптимизирует код и не выделяет переменным память
Тут нет никаких выделений памяти и без оптимизации.
Здравствуйте, MasterZiv, Вы писали:
>> N> char a = 'a'; >> N> char b = 'b'; >> N> char d; >> N> char e; >> N> char* ptr =&a; >> N> c = *ptr++; >> N> d = *ptr--; >> N>
MZ>d = *ptr--; MZ>ты адресуешся по адресу несуществующей переменной.
Насколько я понял просмотрев весь тред: >> N> char* ptr =&a; >> N> c = *ptr++;
начиная с этого момента в ptr лежит адрес произвольного куска памяти, и если убрать разыменование и просто сделать ptr--, то в дальнейшем какие либо операции по нему будут по прежнему операциями с другим произвольным куском памяти, пусть и отстоящим от него на sizeof(char *).
Уточните новичку — я написал верное резюме по мотивам этого треда? ?-)
PS: Сильно напоминает измерения в ядерной физике в которых постулируют невозможность поиметь сразу и координату и энергию, хотя из того, что вот тут накрутили вокруг квантовых компов: http://www.membrana.ru/particle/1901 вывод можно сделать и такой: эти "квантовые" штуки по сути всего лишь очередной сферический конь в вакууме очень удобный для расчетов, господь бог же не подкидывает монетку желая узнать всё что можно о энергии и координате частицы. =)
N> char a = 'a';
N> char b = 'b';
N> char c;
N> char d;
N> char e;
N> char* ptr = &a;
N> c = *ptr++;
N> d = *ptr--;
N>
N>После выполнения указаных действий c равно значению а, а d — указывают на пустую область памяти. Почему?
Потому что компилятор не обязан размещать переменные подряд, сплошь и вверх по стеку.
Только одна переменная — a — обязана иметь адрес и размещаться физически на стеке (т.к. её адрес взяли, ptr=&a).
Другая переменная — d — обязана размещаться где угодно как неконстантная (поскольку ей присваивается нечто произвольное, *(&a+1)).
Переменные b и c можно заменить на константы ('b' и 'a' соответственно) и проинлайнить. Это если компилятор оптимизирующий.
А если не оптимизирующий, и честно размещает переменные на стеке, и не выравнивает их на границу машинного слова (это могло бы повысить скорость доступа), то... ВНЕЗАПНО! Стек-то у нас растёт вниз. http://ideone.com/GlgNG
Здравствуйте, achp, Вы писали:
E>>(&a + sizeof(char))
A>С точки зрения формальной начиная с этого момента мы имеем неопределённое поведение, так как адресная арифметика дозволяется только над указателями, указывающими на элемент массива; &a не указывает на элемент массива.
Адресная арифметика дозволяется над указателями на массив из одного элемента Другое дело, что мы получаем валидный неразыменовываемый указатель "за конец массива", и вот попытка разыменовать его и является UB.
Здравствуйте, Кодт, Вы писали:
E>>Там вроде как разименование невалидного указателя. Это UB дальше может быть что угодно...
К>Валидного. Указатель за конец массива, а также нулевой указатель — вполне себе валидные
Ну, в смысле, негодного для разыменования...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском