Азы С++. Указатели.

Тема в разделе "WASM.BEGINNERS", создана пользователем l_inc, 25 авг 2006.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    У меня этот вопрос появился еще с тех пор, как я начинал изучать С++ и экспериментировал с указателями. В результате этих экспериментов пришел я однажды к таким нескольким строчкам кода:

    А вот результат работы этой программки:
    Внимание вопрос! :)
    Почему указатели на одну и ту же константную область памяти (один объявлен, как указатель на константу, а другой, как указатель на не константу; int *parPtr и const int *parPtr2) при разыменовании дают один результат (15), а сама область памяти содержит прежнее значение (5)???
    P.S. То, что константы указывают на одну и ту же область памяти подтверждается последней строкой вывода.
     
  2. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    l_inc
    Откуда ты знаешь, что область памяти содержит значение 5? Сгенерируй и посмотри на ассемблерный код, компилятор VC6 например в последнем вызове просто подставляет 5 вместо par2, т.к. par2 обьявлено константой.
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Тогда какой смысл вообще в константах (если они не объявлены в качестве аргументов функции)? Какой смысл компилятору выделять под константу память, к которой он все равно не обращается, а имя константы заменяет, как простой макрос (практически тот же #define только с обгаживанием памяти)?
    P.S. Возможно эти вопросы звучат как риторические, поэтому конкретизирую просьбу:
    Действительно ли это так: компилятор выделяет для константы память, с которой никак не работает, а вместо имени константы подставляет просто ее значение (как препроцессор с макросами)??? Пожалуйста, знающие люди, подтвердите или опровергните!!!
    P.P.S. Если это действительно так, то я возмущен С++ до глубины души!!!
     
  4. Kmet

    Kmet New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2006
    Сообщения:
    28
    Адрес:
    Belarus
    Если не ошибаюсь, то стандартом языка это не оговаривается. Это отдается на откуп разработчикам компиляторов. Но как правило, компиляторы по возможности не выделяют память под константы plane типов. Наличие этой возможности напрямую зависит от программиста. В твоем коде разыменование константной переменной вынуждает компилятор выделить память под нее.

    И еще в общем случае не гарантируется, что память под переменные со спецификатором хранения auto(по умолчанию), будет выделенна(и будет ли выделенна вообще) в стеке согластно порядку объявления переменых.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Спасибо. Понятно.
    Хотя не верится, что память под переменную, которая хотя бы раз использовалась в программе, может быть вообще не выделена (независимо от спецификатора хранения). По поводу порядка хранения переменных в памяти (что он должен соответствовать порядку их объявления) я ничего не говорил (если Вы имеете ввиду, что я получил указатель на соседнюю переменную с помощью parPtr--, то это было сделано простым подбором, а не основываясь на рассуждениях о том, как должен порядок расположения переменных в памяти зависеть от порядка их объявления).
    И все-таки странно, что значение константы подставляется вместо ее имени, как макрос. Логичнее было бы, если бы значение константы изменилось и результаты были бы такими:
    Особенно, если учесть, что получение адреса константы в указатель вынудило компилятор выделить память для этой константы.
     
  6. Kmet

    Kmet New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2006
    Сообщения:
    28
    Адрес:
    Belarus
    Почему же странно. Компилятор поступил вполне логично. Имеем константу и указатель на константу, никакие const_cast не использовались, т.е. с точки зрения компилятора значения константы изменится не могло.
    А все извращения остаются на совести программиста=)
     
  7. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    l_inc
    Sun'овский компилятор Явы делает кстати то же самое, то есть это распространенная практика.
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Это оптимизация.