|
|
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
Типы представить могу -- обращение к конкретным ячейкам памяти. Функции содержат различное количество ячеек (локальных переменных), но из программы мы пишем всего лишь одну строку кода - имя функции с аргументами, если есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 14:54:13 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
Функция такойже набор команд хранящийся по какому-либо адресу в момент вызова регистры помещаются на стек а также аргументы внутри функции выталкиваются обрабатываются и возвращается результат, после возврата из функции в точку вызова востанавливаются из стека регистры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 15:27:55 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
гунган, мне хорошо в этом вопросе помогло изучение Asmы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 16:10:15 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
Вот те нагунган, мне хорошо в этом вопросе помогло изучение Asmы не, мне охоту к нему прочно отбили во время учебы. Теперь предпочитаю плавать на уровне ооп... Хотя иногда как-то вниз тянет... GysФункция такойже набор команд хранящийся по какому-либо адресу в момент вызова регистры помещаются на стек а также аргументы внутри функции выталкиваются обрабатываются и возвращается результат, после возврата из функции в точку вызова востанавливаются из стека регистры. Это вроде когда мы в коде пишем вызов функции компилятор заменяет его на адрес,с которого начинается тело функции, а когда наступает return 0;}, то вновь возвращает в главный код? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 17:35:16 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
В разных платформах по разному. Обычно, в стек заносится адрес возврата (адрес команды следующий за вызовом). По завершении происходит переход по этому адресу. Обычно, также, в стеке хранятся параметры или адреса параметров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 17:54:25 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
гунганВот те нагунган, мне хорошо в этом вопросе помогло изучение Asmы не, мне охоту к нему прочно отбили во время учебы. Теперь предпочитаю плавать на уровне ооп... Хотя иногда как-то вниз тянет... если тебе интересно, то все же разберись с асмом, другого пути не знаю. гунган GysФункция такойже набор команд хранящийся по какому-либо адресу в момент вызова регистры помещаются на стек а также аргументы внутри функции выталкиваются обрабатываются и возвращается результат, после возврата из функции в точку вызова востанавливаются из стека регистры. Это вроде когда мы в коде пишем вызов функции компилятор заменяет его на адрес,с которого начинается тело функции, а когда наступает return 0;}, то вновь возвращает в главный код? да, и перед этим чистит за собой стек. точнее, в случае паскалевского соглашения, стек чистит функция, а при сишном соглашении вызывающий код. также есть разные соглашения передачи параметров. при сишном, параметры в стек загоняются с последнего(что позволяет обработать переменное количество параметров. при пасклевском, параметры загоняются с первого. в делфи используется фасткалл соглашение, где по возможности параметры передаются в регистрах, остальные через стек. результат обычно храниться в аккумуляторе. п.с. ознакомься с асмом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 18:45:00 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
ShSerge,ZyK_BotaN,Gys понял,спасибо за разъяснения. Последний вопрос. Если в функции есть переменная, например, строка. Комплексные типы ведь создаются в куче и удаляются вручную. ZyK_BotaNп.с. ознакомься с асмом. оу щит!.. Любопытство меня как-нибудь добъект... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 19:19:19 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
гунган, Строка бывает разная. Это может быть статическая строка в доступной области памяти, а может находится в области памяти, динамически выделенной системой. В последнем случае эту память надо освободить с помощью системного вызова (зависит от платформы). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 19:27:36 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
гунган, Ассемблер сам по себе штука очень простая, но, его, вообще-то маловато. Нужны всякие системные (платформо-зависимые) штучки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 19:29:35 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
ShSergeгунган, Строка бывает разная. Это может быть статическая строка в доступной области памяти, а может находится в области памяти, динамически выделенной системой. Я думал комплексный тип всегда создается в куче. Или оба эти варианта - части кучи, просто доступ к каждой и работа устроены по разному? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 19:45:05 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
гунганЕсли в функции есть переменная, например, строка. Комплексные типы ведь создаются в куче и удаляются вручную. место под локальные переменные выделяется на стеке, в случае с динамическими объектами, типом переменной является указатель, который также храниться на стеке. после возврата из ф-и стек очищается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 19:59:52 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
гунганShSergeгунган, Строка бывает разная. Это может быть статическая строка в доступной области памяти, а может находится в области памяти, динамически выделенной системой. Я думал комплексный тип всегда создается в куче. Или оба эти варианта - части кучи, просто доступ к каждой и работа устроены по разному? на куче создают динамически инициализируемые объекты. те, которые могут жить после выхода из ф-и. ты на каких высокоуровневых языках писал? на с++ или делфи не писал? там на основе одного класса, можно инстанциировать объекты как в куче так и на стеке. в с# это разделено на два класса типов структурных(на стеке) и ссылочных(в куче). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 20:04:55 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
ShSergeгунган, Ассемблер сам по себе штука очень простая, но, его, вообще-то маловато. Нужны всякие системные (платформо-зависимые) штучки. конечно. но он может показать, что представляет для программиста железка. а как этой железкой пользуются разные компиляторы - другая история. еще выше стоит рантайм оси или вм(jvm,clr). но ИМХО, удобней начать с низлежащей платформы, а дальше уточнять специфику используемого языка или системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 20:11:06 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN на куче создают динамически инициализируемые объекты. те, которые могут жить после выхода из ф-и. ты на каких высокоуровневых языках писал? на с++ или делфи не писал? там на основе одного класса, можно инстанциировать объекты как в куче так и на стеке. в с# это разделено на два класса типов структурных(на стеке) и ссылочных(в куче). Давно на c++ писал, но не глубоко. Сейчас выбираю язык с байт-кодом: по с# в частности читал. Не знаю, как в с++, но, например, такой код в функции: String myStr= new String(); В с++ вроде* к имени поставить надо. Получается, создали динамическую переменную. В net-подобных языках их удалением сборщик мусора занимается, в с++ надо было вручную delete написать. ZyK_BotaN[quot гунган]в случае с динамическими объектами, типом переменной является указатель, который также храниться на стеке. после возврата из ф-и стек очищается. Стек очистится, myStr удалится, а выделенная для него память куче останется. Так и выходит, что нужно вручную писать delete myStr перед выходом из функции? Это случай, когда в языке нет сборщика мусора и не используем каких-либо умных указателей. Концептуальный, так сказать, момент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 20:35:02 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
гунганНе знаю, как в с++, но, например, такой код в функции: String myStr= new String(); В с++ вроде* к имени поставить надо. Получается, создали динамическую переменную. с помощью ключевого слова нью создается динамический объект , а String *myStr - является не динамической переменной, а статической переменной указателем на динамический объект.. гунган Стек очистится, myStr удалится, а выделенная для него память куче останется. правильно, но в с++ никто не заставляет размещать объекты в куче, если их размещать на стеке, то деструктор автоматически вызывается при выходе из ф-и, чем с++ выгодно отличается на пример от С#, где для объектов которые используют внешние ресурсы нужно явно вызывать метод dispose. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2010, 20:44:54 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN с помощью ключевого слова нью создается динамический объект , а String *myStr - является не динамической переменной, а статической переменной указателем на динамический объект.. Я об этом же. ZyK_BotaN в с++ никто не заставляет размещать объекты в куче, если их размещать на стеке, Вот этого не знал. Всегда думал, что динамический объект можно создать только в куче и только через new. А для стека какой синтаксис? ZyK_BotaN от С#, где для объектов которые используют внешние ресурсы нужно явно вызывать метод dispose. Не понял. Внешние ресурсы - это значит "из кучи"? В с++: Код: plaintext 1. 2. 3. В c# аналогичная конструкция - выше, но без *, т.к. в этом языке указатели запрещены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2010, 09:12:56 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
гунган ZyK_BotaN в с++ никто не заставляет размещать объекты в куче, если их размещать на стеке, Вот этого не знал. Всегда думал, что динамический объект можно создать только в куче и только через new. А для стека какой синтаксис? Код: plaintext 1. 2. 3. 4. 5. 6. 7. гунган ZyK_BotaN от С#, где для объектов которые используют внешние ресурсы нужно явно вызывать метод dispose. Не понял. Внешние ресурсы - это значит "из кучи"? В с++: нет, внешние ресурсы это например файл. те ресурсы, для которых в шарпе и жаве нужно вызывать dispose(). в с++ delete вызывает деструктор для объектов на куче, а для объектов на стеке, деструктор вызывается автоматически при выходе из ф-и. http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%B0_%D0%B5%D1%81%D1%82%D1%8C_%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2010, 12:55:39 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN Код: plaintext 1. 2. Видел такое, но не обращал внимания, что механика разная. А зачем s2 потом указателю присваивать, если она в стеке? ZyK_BotaN от С#, где для объектов которые используют внешние ресурсы нужно явно вызывать метод dispose. понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2010, 13:20:44 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
гунганZyK_BotaN Код: plaintext 1. 2. Видел такое, но не обращал внимания, что механика разная. А зачем s2 потом указателю присваивать, если она в стеке? понял. я показал отличие в способе вызова методов динамических и автоматических объектов. в первом случае стрелочка Код: plaintext 1. Код: plaintext метод c_str() возвращает сишную строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2010, 14:14:43 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN Код: plaintext 1. 2. 3. 4. 5. 6. 7. Вариант с кучей: разыменовываем указатель s, чтобы обратиться к объекту и вызвать c_str(). В варианте со стеком - сразу обращаемся к объекту s2 и вызываем c_str(). В обоих вариантах результат c_str() сохраняется где-то в куче, а as, as2 получают адрес этого где-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2010, 14:35:45 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
Стек и heap - это (как ни странно) участки памяти. Просто надо помнить что после выхода из функции указатель стека (SP) сбрасывается в изначальное состояние (до входа) и дальнейшие манипуляции с памятью *as2 будут безсмысленны и опасны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2010, 15:57:20 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
maytonСтек и heap - это (как ни странно) участки памяти. Просто надо помнить что после выхода из функции указатель стека (SP) сбрасывается в изначальное состояние (до входа) и дальнейшие манипуляции с памятью *as2 будут безсмысленны и опасны. Вы об этой строке: Код: plaintext 1. Результат c_str() сохраняется в стеке? В C# так же есть возможность сложные типы создавать в стеке или для них только куча? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2010, 18:34:15 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
гунганВ C# так же есть возможность сложные типы создавать в стеке или для них только куча? Насчёт C# - не уверен. Эти современные языки-платформы (шарпы, явы и прочие питоны) оставляют за собой право выбирать, где физически размещать данные. Т.е. heap (для них) уже не является монотонной областью где всё одинаково. Он (heap) скорее всего будет разделён на зоны с разными свойствами. Но ваш вопрос лучше сформулировать в профильном форуме (С++ например). Так будет проще отвечать. По поводу c_str() Здесь пишут следующее http://www.cplusplus.com/reference/string/string/c_str/р const char* c_str ( ) const; Get C string equivalent Generates a null-terminated sequence of characters (c-string) with the same content as the string object and returns it as a pointer to an array of characters. A terminating null character is automatically appended. The returned array points to an internal location with the required storage space for this sequence of characters plus its terminating null-character, but the values in this array should not be modified in the program and are only granted to remain unchanged until the next call to a non-constant member function of the string object. ... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Насколько я понял, результат c_str() является immutable и может быть использован только в read-only контексте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2010, 22:49:30 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
гунган В C# так же есть возможность сложные типы создавать в стеке или для них только куча? в с++ объект одного и того же типа можно разместить как на стеке, так и в куче, а в с# нужно определиться при создании типа типы объявлены ключевым словом class - в куче. struct - на стеке. но при привидении структурных типов к object, или реализуемым ими интерфейсов происходит боксин - копирование объекта в кучу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2010, 01:57:57 |
|
||
|
Как выглядит функция в компиляторе?
|
|||
|---|---|---|---|
|
#18+
по поводу const char*. в языке си - это строка. char - символ. char* - указатель на первый символ строки, строка заканчивается нулевым символом. теперь объясню почему const. при передаче в качестве параметра в ф-ю, объекта, происходит копирование. а при передаче указателя, копируется только указатель, на тот-же объект. Это означает, что принимающая ф-я может изменить объект, чтобы оставить семантику не ссылочного объекта, а именно строки, используется модификатор const, который запрещает изменение объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2010, 02:09:43 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36780688&tid=1343532]: |
0ms |
get settings: |
5ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
218ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 506ms |

| 0 / 0 |
