powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как выглядит функция в компиляторе?
25 сообщений из 28, страница 1 из 2
Как выглядит функция в компиляторе?
    #36780550
гунган
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Типы представить могу -- обращение к конкретным ячейкам памяти. Функции содержат различное количество ячеек (локальных переменных), но из программы мы пишем всего лишь одну строку кода - имя функции с аргументами, если есть.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780560
Gys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Gys
Гость
Функция такойже набор команд хранящийся по какому-либо адресу в момент вызова регистры помещаются на стек а также аргументы внутри функции выталкиваются обрабатываются и возвращается результат, после возврата из функции в точку вызова востанавливаются из стека регистры.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780572
Фотография Вот те на
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гунган,

мне хорошо в этом вопросе помогло изучение Asmы
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780603
гунган
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот те нагунган,
мне хорошо в этом вопросе помогло изучение Asmы
не, мне охоту к нему прочно отбили во время учебы. Теперь предпочитаю плавать на уровне ооп... Хотя иногда как-то вниз тянет...

GysФункция такойже набор команд хранящийся по какому-либо адресу в момент вызова регистры помещаются на стек а также аргументы внутри функции выталкиваются обрабатываются и возвращается результат, после возврата из функции в точку вызова востанавливаются из стека регистры.
Это вроде когда мы в коде пишем вызов функции компилятор заменяет его на адрес,с которого начинается тело функции, а когда наступает return 0;}, то вновь возвращает в главный код?
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780607
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В разных платформах по разному. Обычно, в стек заносится адрес возврата (адрес команды следующий за вызовом). По завершении происходит переход по этому адресу. Обычно, также, в стеке хранятся параметры или адреса параметров.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780626
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гунганВот те нагунган,
мне хорошо в этом вопросе помогло изучение Asmы
не, мне охоту к нему прочно отбили во время учебы. Теперь предпочитаю плавать на уровне ооп... Хотя иногда как-то вниз тянет...

если тебе интересно, то все же разберись с асмом, другого пути не знаю.

гунган
GysФункция такойже набор команд хранящийся по какому-либо адресу в момент вызова регистры помещаются на стек а также аргументы внутри функции выталкиваются обрабатываются и возвращается результат, после возврата из функции в точку вызова востанавливаются из стека регистры.
Это вроде когда мы в коде пишем вызов функции компилятор заменяет его на адрес,с которого начинается тело функции, а когда наступает return 0;}, то вновь возвращает в главный код?
да, и перед этим чистит за собой стек.
точнее, в случае паскалевского соглашения, стек чистит функция, а при сишном соглашении вызывающий код.

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

результат обычно храниться в аккумуляторе.

п.с. ознакомься с асмом.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780644
гунган
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShSerge,ZyK_BotaN,Gys понял,спасибо за разъяснения. Последний вопрос. Если в функции есть переменная, например, строка. Комплексные типы ведь создаются в куче и удаляются вручную.

ZyK_BotaNп.с. ознакомься с асмом.
оу щит!.. Любопытство меня как-нибудь добъект...
:)
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780647
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гунган,

Строка бывает разная. Это может быть статическая строка в доступной области памяти, а может находится в области памяти, динамически выделенной системой. В последнем случае эту память надо освободить с помощью системного вызова (зависит от платформы).
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780648
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гунган,

Ассемблер сам по себе штука очень простая, но, его, вообще-то маловато. Нужны всякие системные (платформо-зависимые) штучки.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780656
гунган
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShSergeгунган,
Строка бывает разная. Это может быть статическая строка в доступной области памяти, а может находится в области памяти, динамически выделенной системой.
Я думал комплексный тип всегда создается в куче. Или оба эти варианта - части кучи, просто доступ к каждой и работа устроены по разному?
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780661
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гунганЕсли в функции есть переменная, например, строка. Комплексные типы ведь создаются в куче и удаляются вручную.


место под локальные переменные выделяется на стеке, в случае с динамическими объектами, типом переменной является указатель, который также храниться на стеке.
после возврата из ф-и стек очищается.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780666
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гунганShSergeгунган,
Строка бывает разная. Это может быть статическая строка в доступной области памяти, а может находится в области памяти, динамически выделенной системой.
Я думал комплексный тип всегда создается в куче. Или оба эти варианта - части кучи, просто доступ к каждой и работа устроены по разному?

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

ты на каких высокоуровневых языках писал?
на с++ или делфи не писал? там на основе одного класса, можно инстанциировать объекты как в куче так и на стеке.
в с# это разделено на два класса типов структурных(на стеке) и ссылочных(в куче).
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780668
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeгунган,

Ассемблер сам по себе штука очень простая, но, его, вообще-то маловато. Нужны всякие системные (платформо-зависимые) штучки.

конечно.
но он может показать, что представляет для программиста железка.
а как этой железкой пользуются разные компиляторы - другая история.
еще выше стоит рантайм оси или вм(jvm,clr).

но ИМХО, удобней начать с низлежащей платформы, а дальше уточнять специфику используемого языка или системы.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780680
гунган
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZyK_BotaN
на куче создают динамически инициализируемые объекты. те, которые могут жить после выхода из ф-и.

ты на каких высокоуровневых языках писал?
на с++ или делфи не писал? там на основе одного класса, можно инстанциировать объекты как в куче так и на стеке.
в с# это разделено на два класса типов структурных(на стеке) и ссылочных(в куче).
Давно на c++ писал, но не глубоко. Сейчас выбираю язык с байт-кодом: по с# в частности читал. Не знаю, как в с++, но, например, такой код в функции: String myStr= new String(); В с++ вроде* к имени поставить надо. Получается, создали динамическую переменную. В net-подобных языках их удалением сборщик мусора занимается, в с++ надо было вручную delete написать.

ZyK_BotaN[quot гунган]в случае с динамическими объектами, типом переменной является указатель, который также храниться на стеке.
после возврата из ф-и стек очищается.
Стек очистится, myStr удалится, а выделенная для него память куче останется. Так и выходит, что нужно вручную писать delete myStr перед выходом из функции? Это случай, когда в языке нет сборщика мусора и не используем каких-либо умных указателей. Концептуальный, так сказать, момент.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780688
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гунганНе знаю, как в с++, но, например, такой код в функции: String myStr= new String(); В с++ вроде* к имени поставить надо. Получается, создали динамическую переменную.

с помощью ключевого слова нью создается динамический объект ,
а String *myStr - является не динамической переменной, а статической переменной указателем на динамический объект..

гунган
Стек очистится, myStr удалится, а выделенная для него память куче останется.
правильно, но в с++ никто не заставляет размещать объекты в куче, если их размещать на стеке, то деструктор автоматически вызывается при выходе из ф-и, чем с++ выгодно отличается на пример от С#, где для объектов которые используют внешние ресурсы нужно явно вызывать метод dispose.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780831
гунган
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZyK_BotaN
с помощью ключевого слова нью создается динамический объект ,
а String *myStr - является не динамической переменной, а статической переменной указателем на динамический объект..

Я об этом же.

ZyK_BotaN
в с++ никто не заставляет размещать объекты в куче, если их размещать на стеке,
Вот этого не знал. Всегда думал, что динамический объект можно создать только в куче и только через new. А для стека какой синтаксис?

ZyK_BotaN
от С#, где для объектов которые используют внешние ресурсы нужно явно вызывать метод dispose.
Не понял. Внешние ресурсы - это значит "из кучи"? В с++:
Код: plaintext
1.
2.
3.
String *myStr; myStr= new String();
delete myStr;
return  0 ; }
освободили кусок кучи -"отвязали" myStr. Затем и myStr удалится.
В c# аналогичная конструкция - выше, но без *, т.к. в этом языке указатели запрещены.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780927
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гунган

ZyK_BotaN
в с++ никто не заставляет размещать объекты в куче, если их размещать на стеке,
Вот этого не знал. Всегда думал, что динамический объект можно создать только в куче и только через new. А для стека какой синтаксис?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
        //в куче
	std::string *s = new std::string("abv");
	const char *as = s->c_str();
	//на стеке
	std::string s2 = std::string("abv");
	const char *as2 = s2.c_str();
	

гунган
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
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780942
гунган
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZyK_BotaN
Код: plaintext
1.
2.
	//на стеке
	std::string s2 = std::string("abv");

Видел такое, но не обращал внимания, что механика разная. А зачем s2 потом указателю присваивать, если она в стеке?

ZyK_BotaN
от С#, где для объектов которые используют внешние ресурсы нужно явно вызывать метод dispose.
понял.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36780981
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гунганZyK_BotaN
Код: plaintext
1.
2.
	//на стеке
	std::string s2 = std::string("abv");

Видел такое, но не обращал внимания, что механика разная. А зачем s2 потом указателю присваивать, если она в стеке?
понял.

я показал отличие в способе вызова методов динамических и автоматических объектов.
в первом случае стрелочка
Код: plaintext
1.
const char *as = s->c_str();
а во втором точка.
Код: plaintext
const char *as2 = s.c_str();
[src]const char *as/SRC] - рассматривается не как указатель на символ, а как сишная строка.
метод c_str() возвращает сишную строку.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36781000
гунган
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZyK_BotaN
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
        //в куче
	std::string *s = new std::string("abv");
	const char *as = s->c_str();
	//на стеке
	std::string s2 = std::string("abv");
	const char *as2 = s2.c_str();
	

Вариант с кучей: разыменовываем указатель s, чтобы обратиться к объекту и вызвать c_str().
В варианте со стеком - сразу обращаемся к объекту s2 и вызываем c_str(). В обоих вариантах результат c_str() сохраняется где-то в куче, а as, as2 получают адрес этого где-то?
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36781072
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стек и heap - это (как ни странно) участки памяти. Просто надо помнить что после выхода из функции указатель стека (SP) сбрасывается в изначальное состояние (до входа) и дальнейшие манипуляции с памятью *as2 будут безсмысленны и опасны.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36781145
гунган
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonСтек и heap - это (как ни странно) участки памяти. Просто надо помнить что после выхода из функции указатель стека (SP) сбрасывается в изначальное состояние (до входа) и дальнейшие манипуляции с памятью *as2 будут безсмысленны и опасны.
Вы об этой строке:
Код: plaintext
1.
std::string s2 = std::string("abv");
const char *as2 = s.c_str();
?
Результат c_str() сохраняется в стеке?
В C# так же есть возможность сложные типы создавать в стеке или для них только куча?
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36781273
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гунганВ 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.
// strings and c-strings
#include <iostream>
#include <cstring>
#include <string>
using namespace std;

int main ()
{
  char * cstr, *p;

  string str ("Please split this phrase into tokens");

  cstr = new char [str.size()+ 1 ];
  strcpy (cstr, str.c_str());

  // cstr now contains a c-string copy of str

  p=strtok (cstr," ");
  while (p!=NULL)
  {
    cout << p << endl;
    p=strtok(NULL," ");
  }

  delete[] cstr;  
  return  0 ;
}


Насколько я понял, результат c_str() является immutable и может быть использован только в read-only контексте.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36781335
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гунган
В C# так же есть возможность сложные типы создавать в стеке или для них только куча?

в с++ объект одного и того же типа можно разместить как на стеке, так и в куче,
а в с# нужно определиться при создании типа
типы объявлены ключевым словом
class - в куче.
struct - на стеке.
но при привидении структурных типов к object, или реализуемым ими интерфейсов происходит боксин - копирование объекта в кучу.
...
Рейтинг: 0 / 0
Как выглядит функция в компиляторе?
    #36781337
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по поводу const char*.
в языке си - это строка.
char - символ.
char* - указатель на первый символ строки, строка заканчивается нулевым символом.
теперь объясню почему const.

при передаче в качестве параметра в ф-ю, объекта, происходит копирование.
а при передаче указателя, копируется только указатель, на тот-же объект. Это означает, что принимающая ф-я может изменить объект, чтобы оставить семантику не ссылочного объекта, а именно строки, используется модификатор const, который запрещает изменение объекта.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как выглядит функция в компиляторе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]