LINUX.ORG.RU

С++ : Как понимать фразу «сам указатель является константным»?


0

1

Вот в этой книге:

http://www.plam.ru/compinet/yeffektivnoe_ispolzovanie_c_55_vernyh_sposobov_ul...

есть следующая фраза (речь идет о модификаторе const и объявлении указателя):

Если слово const появляется слева от звездочки, константным является то, на что указывает указатель; если справа, то сам указатель является константным.



Вопрос: что скрывается под фразой «сам указатель является константным»?

С точки зрения машинного кода, указатель - это ячейка памяти, в которой хранится адрес значения, на которое указывает указатель. При обращении к указателю, компилятор по имени указателя вычисляет адрес ячейки памяти указателя, берет из нее адрес значения. И дальше использует этот адрес значения (обычно обращение происходит через инструкцию LEA).

«Сам указатель является константным» - это значит, что:

Вариант 1

... в ячейке памяти указателя может храниться только один адрес, заданный при инициализации. Соответственно, указатель может ссылаться только на одну-единственную ячейку памяти, адрес которой был задан при инициализации.

Вариант 2

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

Какой вариант правильный? Или правильным будет какой-то третий вариант?

★★★★★

Ответ на: комментарий от emulek

ты так ничего и не понял. Суть в том, что НЕ НУЖНО этого знать.

В этом суть сишечки, и именно для этого её и придумали. И именно потому я не знаю, и не хочу знать, сколько бит в int'е. Или сколько в ptrdiff_t.

Т.е. сишечка == некая виртуальная машина, которой нет. Программа пишется в терминах этой виртуальной машины. Потом она компилируется, и подгоняется по месту компилятором.

Все это верно ровно до тех пор, пока не приходится реализовывать вполне конкретные протоколы/форматы на вполне конкретные размеры данных, и при этом кроссплатформенно.

Попытка скрыть за абстракциями реальные размеры данных привела к появлению нестандартных ублюдочных типов вроде BYTE, WORD, DWORD, которые есть в одних компиляторах, и нет в других. Единого подхода нет, хотя проблема очевидна, и каждый извращается по своему.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Я не желаю осиливать это дерьмо.

Скажем так: разработчики языка не сделали ровным счетом ничего, чтобы упростить семантику конструкций. Контекстно-зависимый синтаксис в C++ - это жуткое порождение темного гения.

Но, к сожалению, C++ в том виде который есть сейчас - это единственная альтернатива по параметрам производительность/высокоуровневость/кроссплатформенность. Другого лидера нет.

Microsoft сделала очень грамотный и большой шаг в сторону C#, но к сожалению, это проприетарная разработка, хоть и заверяют о ее открытости. Ну и среда выполнения - не само железо непосредственно, как это происходит в С/C++, что всегда будет ограничивать производительность. Хотя разрыв чуствуется все меньше и меньше.

Я надеюсь, что рано или поздно откажутся от C++, и появится таки мейнстриновый свободный кроссплатформенный аналог C#. Пусть это будет Mono, D, или что-то еще - неважно. Главное, что развитие C++ в том виде, в котором оно ведется сейчас - это путь в никуда.

Вот сейчас есть негласное соглашение - до ARM7 разрешается писать чистый код, который тупо выполняется на проце без всякого окружения, без операционной системы. Все что выше ARM7 - разрабатывать код под Linux. Такой код будут сопровождать в открытых проектах ARM7 и выше, а низкоуровневый - нет. То есть, Linux стал «виртуальной машиной», на которой выполняется код даже во встраиваемых устройствах. Пожертвовали производительностью ради унификации. И это правильно.

Я надеюсь, что и у C++ появится вменяемый преемник, разработчики которого будут понимать, что код пишет человек, а не биоробот.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Сложность C++ вытекает из решаемых на нем задач. Попытаешься решить на другом языке такую же задачу аналогичным по аппетитам результата образом - получишь ещё худший и запутанный код. Или столь же ужасный(в случае D). Или вообще не сможешь достичь тех же показателей(что возможно, если речь не о C и D). Как-то так... Так что лучше не использовать C++ там, где не нужно.

anonymous
()

что скрывается под фразой «сам указатель является константным»?

Ничего не скрывается, смысл тут буквальный, т.е. указатель нельзя изменить. Чё тут непонятного? Сколько народу изучало кресты, на моей памяти, никто не затутплял в этом месте.

no-such-file ★★★★★
()
Ответ на: комментарий от Xintrea

Попытка скрыть за абстракциями реальные размеры данных привела к появлению нестандартных ублюдочных типов вроде BYTE, WORD, DWORD, которые есть в одних компиляторах, и нет в других. Единого подхода нет, хотя проблема очевидна, и каждый извращается по своему.

есть вполне стандартные int32_t, а твоё незнание == твоя проблема.

emulek
()
Ответ на: комментарий от bhfq

Т.е. на 4 звездах ТС должен начать писать похабщину и поставить на аватарку пони? :)

это каждый для себя решает сам.

emulek
()
Ответ на: комментарий от emulek

ты так ничего и не понял. Суть в том, что НЕ НУЖНО этого знать. Смотри:

Поэтому ты и макака.

1. я пишу код, который корректен с т.з стандарта

Ты пишешь говно.

2. ты пишешь код, который корректен с т.з. amd64-процессора

Ты даже не представляешь какую херню ты несёшь.

Надеюсь ты понимаешь, почему ты говнокодер, а я — нет? Объясню: твой говнокод работает только на твоём локалхосте. А мой — где угодно(где есть компилятор).

Ты. А мне не надо чтобы он работал на чем-то кроме локалхоста, да и кроме локалхоста и аврки ты в свойе жалкой жизни иничего не видел, зачем ты кукарекаешь про «все?».

Ты кукарекаешь о «где угодно» лишь потому, что ты нихрена о матчасти не знаешь.

В этом суть сишечки, и именно для этого её и придумали. И именно потому я не знаю, и не хочу знать, сколько бит в int'е. Или сколько в ptrdiff_t.

Нет животное - её не за этим придумали. Её придумали для удобства - всё. Любой маломальский граммотный( ты к ним не относишься) понимает, что нельзя написать чего-то сложнее хелворда не зная сколько бит в инте.

Т.е. сишечка == некая виртуальная машина, которой нет. Программа пишется в терминах этой виртуальной машины. Потом она компилируется, и подгоняется по месту компилятором.

Только в представлении нулёвой макаки типа тебя, которая сложнее хелворда ничего не писала и кроме маздайки в жизни ничего не видела.

Вменяемый код пишется с учетом целевой платформы, пишется десяток реализаций, пишется сотня фичей в конпеляторе. Либо ты реально идиот думаешь, что весь код такое же говно, какое выходит из под тебя?

gcc сам может помнить про константность, даже если об этом не писать, однако долго он об этом не помнит.

Как же ты ты любит писать херню о вещах в которых не шаришь. Гцц определяет константы со 100% вероятностью всегда и во ВСЕХ СЛУЧАЯХ. И чего это там долго не помнит?

Понимаешь, тупое животное, для гцц const int и int - это равнозначные типы и если он не определит значение x, то он умножение на сдвиг не заменит НИКОГДА, а заменит он только тогда, когда определит значение, а когда он его определит - ОН ОПРЕДЕЛИТ ЕГО КОНСТАНТНОСТЬ, идиот, ибо в противном случае он его не определит.

т.е. фишка const это вовсе ни какие-то «запреты», а наоборот — разрешение для компилятора. Мы разрешаем компилятору НЕ хранить переменную в памяти, т.к. она никогда не меняется.

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

Если ничего не писать, то компилятор пытается сам считать переменную const, если это возможно.

Тупое животное - переменная и const - это всё синтаксическая байда, которая никак не влияет на то, что там конпелятор считает. Ему абсалютно покласть константа она или нет - он пытается найти значение, если не поможет - пытается вычилить, если же и вычислить не можете - он считает её за неопределённую. Всё, нет тут никаких констант и все похрен на них.

anonymous
()
Ответ на: комментарий от Xintrea

Все это верно ровно до тех пор, пока не приходится реализовывать вполне конкретные протоколы/форматы на вполне конкретные размеры данных, и при этом кроссплатформенно.

Это не верно никогда. Никакой код на сишке не пишется без учёта платформы - суть сишки не в том, что сказал этот питух - это язык, который позволяет использовать и юзать особенности платформы, тем самым писать под конкретные аппаратные платформы код. Именно этим сишка отличается от жабы, плюсов и прочей муры. Т.е. имет возможности ассемблера таргета без этого самого ассемблера. Допустим, gnuc имеет 99.3% возможностей ассемблера любого таргета.

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

Нет, это не та попытка. Это попытка чистого вендорлока на бейсик-питухах. Т.е. апи маздайки состоит из паскалятинки и бейсика на 95% и ворды там не для того, чтобы что-то там скрестить, а чтобы нулёвые макаки которые перелезли из доса на вантузку писали не переносимый код.

Макака не способна юзать в winapi word"ы, а в остальном окде инты - макака всегда писала ворды. Так же как и всякие «нестандартные» функции - это н епопытки обезопасить, а посадить на вендорлок макак. Так же как и 64битные инты и прочее.

Есть stdint.h - кури, питух выше тебе об этом скзал.

anonymous
()
Ответ на: комментарий от emulek

Любой маломальский граммотный( ты к ним не относишься) понимает, что нельзя написать чего-то сложнее хелворда не зная сколько бит в инте.

мудило, Дональд Кнут по твоему "граммотный"?

emulek
()
Ответ на: комментарий от anonymous

Тупое животное - переменная и const - это всё синтаксическая байда, которая никак не влияет на то, что там конпелятор считает. Ему абсалютно покласть константа она или нет - он пытается найти значение, если не поможет - пытается вычилить, если же и вычислить не можете - он считает её за неопределённую. Всё, нет тут никаких констант и все похрен на них.

слышь, царь? Ты скучен.

emulek
()

Вопрос: что скрывается под фразой «сам указатель является константным»?

Бред идиотов.

С точки зрения машинного кода, указатель - это ячейка памяти, в которой хранится адрес значения, на которое указывает указатель. При обращении к указателю, компилятор по имени указателя вычисляет адрес ячейки памяти указателя, берет из нее адрес значения. И дальше использует этот адрес значения (обычно обращение происходит через инструкцию LEA).

Ещё один бред. С точки зреания машшиного кода, как и ЯП - твоя указатель - это число(значение) - всё.

Тип указателя используется для арифметики и разименования. Сколько байт прибавить, сколько разименовать. lea - это не мув.

Конпелятор не вычисляет никакие адреса, ибо указатель итак адрес. Даже при дуступе к полям происходит так: ptr->a; *(type *)(ptr + offset); Где type - это тип поля, а оффсет - оффсет до него. Нету никаких ячеек памяти - это уровень детсада. Есть только адреса.

Какой вариант правильный? Или правильным будет какой-то третий вариант?

Что даёт const инту? Тоже самое даёт и указателю. Если в другом месте, то константным являетяс уже результат разименования. (ptr = 1) - это твой случай, (*ptr = 1) - это вторйо случай.

anonymous
()
Ответ на: комментарий от emulek

слышь, царь?

Слышу.

Ты скучен.

Ну когда питух несёт херню - естественно питуху тоже скучно и мне скучно. Ты, кстати, ссань, на форуме-то слилась чтоли?

Ты мне так и не ответил на вопрос - тебе вкатывает нести херню? Тебе реально не интересно разобраться в вопросе, а потом уже кукарекать? Либо ты просто кукарекаешь ради кукаретинга? Я просто не представляю нахрен так жить.

anonymous
()
Ответ на: комментарий от x0r

Кто бы говорил, пониложец. Рака копыта твоему аватару

anonymous
()
Ответ на: комментарий от anonymous

Вопрос: что скрывается под фразой «сам указатель является константным»?

Бред идиотов.

т.е. ты не осилил?

в остальном — повеселил, да.

emulek
()
Ответ на: комментарий от Xintrea

Вот, этого ответа я ждал. Складывается впечатление, что 90 перцентов отписавшихся вообще не понимают как работает прога на железе.

Я тебя удивлю, но никто в этом тереде не понимает как что-то работает выше примитивного уровня, либо на уровне реалий( в их жалком понимании), которые реально уже давно протухли и не актуальны.

anonymous
()
Ответ на: комментарий от anonymous

Ну когда питух несёт херню - естественно питуху тоже скучно и мне скучно. Ты, кстати, ссань, на форуме-то слилась чтоли?

а кого в вашей среде называют «питухом»?

Ты мне так и не ответил на вопрос - тебе вкатывает нести херню? Тебе реально не интересно разобраться в вопросе, а потом уже кукарекать? Либо ты просто кукарекаешь ради кукаретинга? Я просто не представляю нахрен так жить.

ты с чем не согласен? Что тебе непонятно?

emulek
()
Ответ на: комментарий от anonymous

Я тебя удивлю, но никто в этом тереде не понимает как что-то работает выше примитивного уровня, либо на уровне реалий( в их жалком понимании), которые реально уже давно протухли и не актуальны.

вот-вот! Мы как раз тебя ждали с объяснением.

ЗЫЖ на форум потом загляну, а то мне работать надо, а без стакана во лбу я тебя не понимаю.

emulek
()
Ответ на: комментарий от Xintrea

BYTE, WORD, DWORD

Ты палишься, виндузятник. Используй нормальный ОС и компиляторы, которые следуют стандартам, а не гадят на каждом углу. Да, иногда приходиться писать под странные ОС и собирать плохими компиляторами, но это не проблема языка. У си вообще проблем нет.

anonymous
()
Ответ на: комментарий от anonymous

«Реально» там потоки элементарных частиц, если что. Ты же просто объясняешь на другом уровне абстракции, чем остальные. Хотя элементарные частицы - тоже абстракция. А что там на самом деле знает только Бог, а его нет. Такие дела. Так что ты прав, когда разоблачаешь ложь, но неправ, когда предъявляешь претензии к правильному объяснению по поводу уровня абстракции.

anonymous
()
Ответ на: комментарий от emulek

ЗЫЖ на форум потом загляну, а то мне работать надо, а без стакана во лбу я тебя не понимаю.

Ты такая смешная обсосинка. Где тебе работать надо? Ты так яро там кукарекал, а как обосрался так вдруг работать надо, причем на лоре балаболить ему работа не мешает.

Дак и какая у тебя работа - ты нищая(во всех смыслах) макака. Максимум просиживание штанов каким-нибудь «программо»-еникеем в офисе какой-то бюджетной говноконторке.

anonymous
()
Ответ на: комментарий от anonymous

Ты такая смешная обсосинка.

у тебя фтопик что-то есть?

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.