EvilsInterrupt Не спорь. Каши много. Что до Виртуального Адресного Пространства, - да, ты действительно жутко ошибаешься, если думаешь, что операционной системе где-то обломалось дофига гигабайт свободной памяти, и она щедро по 4Гб раздает ее процессам, а все остальное - куча. Broken Sworda ты читал? Я тоже нет Пойду читать, и тебе того же советую. До шестой главы включительно - как минимум. Половина вопросов отпадет сама собой.
Приступаю к вопросу №2: Есть const int * pAge = new int; за тем чтобы в эту память ни че было записано, кто следит: компилятор или винда во время выполнение кода? а если: int * * const pAge = new int этот указатель нельзя изменить до компиляции или во вовремя работы кода тоже?
>за тем чтобы в эту память ни че было записано, кто следит: компилятор или винда во время выполнение кода? компилятор >этот указатель нельзя изменить непонятен вопрос. Если идёт речь о значении указателя, то можно
Есть const int * pAge = new int; Что это за шедевр? int * * const pAge = new int А вот от этого у меня вообще глаза на лоб вылезли! 8-()
Turkish Я думаю что это не обязательно так... Все зависит от компилятора: как это в нем реализованно. Место может также выделяться не в куче, а на стеке...
Oleg_SK >Я думаю что это не обязательно так... Все зависит от компилятора: как это в нем реализованно. ну, компиляторы все же пишут не от балды, а худо-бедно придерживаясь стандарта.
Code (Text): @@@@ @@@@ @@@@ @@@@ @ @ @ @ @@@ @ @ @@@@@ @ @ @@@@@ @ @@@@@@@ @ @ @ @ @ @ @ @ @ @ @@ @@ @ @ @ @ @ @@ @@ @ @ @ @ @ @ @ @ @ @@@ @ @ @ @ @ @ @ @@ @ @ @@@@ @ @ @@@@ @ @@ @@@@ @ @ @ @ @@@ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @@@ @ @ @ @@ @ @ @@@ @ @ @ @@@ @@@ @ @ @@@@ @@@ @@@@ @ @@ @@ @@@@@@@ @@@@ @ @ @ @ @@ @@ @@ @@ @ @ @ @ @ @@ @@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @@ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @@ @@@ @@@ @ @ @ @ @ @ @ @@@@@@@@@ @ @ @ @ @ @ @ @@ @@ @ @ @ @ @ @ @ @ @ @ @ @@ @@ @@ @@ @ @ @@ @@ @@ @@ @ @ @
EvilsInterrupt > Програмист ozzman > В стандарте нет ни слова ни о xxxxAlloc, ни о виндос. vinnie_pooh ВО-ВО !!
Если в тексте кода на c++ создать объект в динамической памяти и присвоить в постоянный указатель: class Girl { public: bla,bla; private: bla,bla; }; Girl * const pNatali = new Girl; кто будет следить за тем чтобы этот указатель не изменился? Программист, т.к. компилятор ошибки даст. А если я создам код и во время выполниния проги это место(указатель) буду менять позволит ли мне это винда? 2) const Girl * pNatali = new Girl; Если я в коде не изменю, но создам к примеру вирус и попробую изменить место на которое указывает pNatali, то позволит ли мне винда?
S_T_A_S_ то есть, гипотетически, я могу написать компилятор, который по new будет выделять память, например, в стеке? имхо, стандарт этого непозволит.
Что есть стэк? Если речь идёт о памяти, к которой мы адресуемся через регистры ESP (EBP), то что мешает обращаться к этой же памяти через другие регистры? Если же говорим о абстрактном хранилище с доступом "First In, Last Out", то конечно не удобно выделять там память под объекты, которые могут быть удалены в произвольное время. для этих целей лучше подходит хранилище с произвольным доступом (куча). А стандарту вообще фиолетово до особенностей архитектуры процессоров x86
q_q S_T_A_S_ речь идет именно про реализацию компилятора. Как там реализован или может быть реализован оператор new, не нарушая стандарта.
Ещё раз повторю: в стандарте написано, что БАЙТ может быть НЕ РАВЕН 8 БИТАМ, до стэка (который есть не у всех процессоров) ему тем более дела нет. ЗЫ Стандарт называется: ansi_iso_iec_14882_1998.pdf
сказал Oleg_SK. =) у тя действительно каша в голове. не торопись. все понимают - изучать язык программирования (любой) довольно скушно, тем более изучать его стандарт (по ISO) . Изучать архитектуру ОС (любой) несколько интереснее. Но не нужно смешивать и подменять понятия ... Вот на твои некорректные вопросы я мог бы ответить так(например): 1. С++ - язык программирования (какой последний ISO не помню =) ) 2. Компилляторы под ОС Windows такие как Borland, M$ Visual, етц. поддерживают этот язык вместе со своими прибамбасами называемыми специфичными расширениями. 3. !!!_ВСЕ_!!! компилляторы для ОС Виндовоз преобразуют операторы и прочую, специфичную для каждого конкретного языка программирования , хрень, в конечном виде к вызовам системных сервисов. Например (не точно!): new -> VirtualAlloc -> NtAllocateVirtualMemory точно так же, если ты создаешь "кучу", то в Виндовозе это в конечном итоге преобразуется в вызов ZwAllocateVirtualMemory - что есть синоним для NtAllocateVirtualMemory. Вот тебе наглядный пример связи языка программирования С++ с ОС Виндовоз. Что там из new в конечном итоге точно получается ты можешь сам посмотреть - возьми IDA и все все увидишь =) я сейчас не помню, а лезть туда неохота....
совершенно верно S_T_A_S_ ! как истынный Воин дзена ты глаголишь истину ... ибо только "октет" ДОЛЖЕН быть равен 8 битам, всегда и везде... в смысле на любой платформе и в любом компиляторе