Re[5]: И еще один
От: Nortsx  
Дата: 25.07.11 09:38
Оценка:
Здравствуйте, Nortsx, Вы писали:

N>Здравствуйте, Edain, Вы писали:


E>>Здравствуйте, Nortsx, Вы писали:


N>>>Что означает зщапись например int& i = какому нить другмоу инту.

N>>>Это ссылка, но какую функциональность может она нести, если для взятия ссылки от объекта достаточно &имя.
N>>>Вот правда не понимаю

E>>Ссылки полезно использовать в качестве формальных аргументов функций, чтобы избежать копирования этих самых аргументов. Также я иногда использую ссылки в циклах по контейнерам исключительно в эстетических целях, чтобы не использовать итераторы. Например,


E>>
E>>for (std::vector<MyFancyObject>::iterator i = _objects.begin(), iend = _objects.end(); i != iend; ++i)
E>>{
E>>   MyFancyObject &obj = *i;

E>>   DoStuffWithObject(obj);
E>>}
E>>


E>>Не знаю, насколько это снижает производительность цикла, не мерял.


E>>А вообще, да, это базовые вещи, которые отлично разъяснены во всех учебниках.

Сорри,отправил пустое сообщение.

Как раз такой вопрос у меня и возник после прочтения учебника)
Он звучит не как "зачем нужны ссылки", а как "зачем ссылкам псевдонимы".
Ну я жуе увидел примеры использования, когда улучшается ридабилити кода и т д.
Re: ТУпейший вопрос про указатели
От: wisp Украина  
Дата: 26.01.12 10:17
Оценка:
Здравствуйте, Nortsx, Вы писали:

N>
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) компилятор оптимизирует код и не выделяет переменным память
Re[2]: ТУпейший вопрос про указатели
От: MasterZiv СССР  
Дата: 26.01.12 11:42
Оценка:
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) компилятор оптимизирует код и не выделяет переменным память


Тут нет никаких выделений памяти и без оптимизации.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: ТУпейший вопрос про указатели
От: grey_olli http://grey-olli.livejournal.com
Дата: 26.01.12 17:44
Оценка:
Здравствуйте, 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 вывод можно сделать и такой: эти "квантовые" штуки по сути всего лишь очередной сферический конь в вакууме очень удобный для расчетов, господь бог же не подкидывает монетку желая узнать всё что можно о энергии и координате частицы. =)
--
Bye.Olli.
gpg --search-keys grey_olli
Key fingerprint = 09B6 E060 DD67 04B9 E53B 721B 12E2 7401 F8A4 FC68
Re: ТУпейший вопрос про указатели
От: Кодт Россия  
Дата: 26.01.12 18:58
Оценка:
Здравствуйте, Nortsx, Вы писали:

N>
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
#include <stdio.h>
 
int main()
{
  char a = 'a';
  char b = 'b';
  char c;
  char d;
 
  printf("%p %p %p %p\n", &a, &b, &c, &d);
  printf("%d='%c'\n", (&a)[0], (&a)[0]);
  printf("%d='%c'\n", (&a)[1], (&a)[1]);
}

выводит (сделал 4 попытки)

0xbfdbc217 0xbfdbc216 0xbfdbc215 0xbfdbc214
97='a'
48='0'

0xbfc29d47 0xbfc29d46 0xbfc29d45 0xbfc29d44
97='a'
96='`'

0xbffa35e7 0xbffa35e6 0xbffa35e5 0xbffa35e4
97='a'
0=''

0xbfd20217 0xbfd20216 0xbfd20215 0xbfd20214
97='a'
48='0'

Так что в переменную d в твоём примере попадает не значение b, а кусок служебной информации (адрес возврата, заголовок кадра и т.п.)
Перекуём баги на фичи!
Re[3]: ТУпейший вопрос про указатели
От: Кодт Россия  
Дата: 26.01.12 19:01
Оценка:
Здравствуйте, achp, Вы писали:

E>>(&a + sizeof(char))


A>С точки зрения формальной начиная с этого момента мы имеем неопределённое поведение, так как адресная арифметика дозволяется только над указателями, указывающими на элемент массива; &a не указывает на элемент массива.


Адресная арифметика дозволяется над указателями на массив из одного элемента Другое дело, что мы получаем валидный неразыменовываемый указатель "за конец массива", и вот попытка разыменовать его и является UB.
Перекуём баги на фичи!
Re[12]: ТУпейший вопрос про указатели
От: Кодт Россия  
Дата: 26.01.12 19:03
Оценка:
Здравствуйте, Erop, Вы писали:

E>Там вроде как разименование невалидного указателя. Это UB дальше может быть что угодно...


Валидного. Указатель за конец массива, а также нулевой указатель — вполне себе валидные
Перекуём баги на фичи!
Re[13]: ТУпейший вопрос про указатели
От: Erop Россия  
Дата: 26.01.12 23:02
Оценка:
Здравствуйте, Кодт, Вы писали:

E>>Там вроде как разименование невалидного указателя. Это UB дальше может быть что угодно...


К>Валидного. Указатель за конец массива, а также нулевой указатель — вполне себе валидные


Ну, в смысле, негодного для разыменования...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.