Информация об изменениях

Сообщение Re[14]: "class const - метод" - можно ли организовать? от 23.09.2015 19:56

Изменено 23.09.2015 20:02 _hum_

Здравствуйте, VTT, Вы писали:

VTT>Здравствуйте, _hum_, Вы писали:


VTT>0) заводит стек функций


__>>не совсем понял, в каком месте (и в какой ситуации) не пройдет описанный мною выше алгоритм?


VTT>Да с самого начала. В общем случае у компилятора нет никакой возможности построить этот стек вызовов. Вот например: метод foo_B класса C_B вызывается через указатель на абстрактный базовый класс. О том, что вызвался метод именно в классе C_B мы можем узнать только в runtime.


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

то компилятор будет действовать так:
— первый раз пробегает по тексту программы и заносит себе в память информацию о том, какие функции в программе объявлены (какие у них сигнатуры), и где у каждой объявленной функции определение (текст тела функции);
— второй раз пробегает по тексту программы и, встретив декларацию функции "foo_A(void)class_const", заносит ее первой в стек;
а дальше по п. 2)
берет с вершины стека foo_A(void)class_const и переходит к ее телу (информация о том, где оно , уже имеется после первого прохода):
void C_A::foo_A(void)const
{
    m_pB->foo_B();
}

в теле видит вызов функции void foo_B(void), потому заносит его сигнатуру в стек; и т.д.

в каком месте он может споткнуться?
Re[14]: "class const - метод" - можно ли организовать?
Здравствуйте, VTT, Вы писали:

VTT>Здравствуйте, _hum_, Вы писали:


VTT>0) заводит стек функций


__>>не совсем понял, в каком месте (и в какой ситуации) не пройдет описанный мною выше алгоритм?


VTT>Да с самого начала. В общем случае у компилятора нет никакой возможности построить этот стек вызовов. Вот например: метод foo_B класса C_B вызывается через указатель на абстрактный базовый класс. О том, что вызвался метод именно в классе C_B мы можем узнать только в runtime.


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

то компилятор будет действовать так:
— первый раз пробегает по тексту программы и заносит себе в память информацию о том, какие функции в программе объявлены (какие у них сигнатуры), и где у каждой объявленной функции определение (текст тела функции);
— второй раз пробегает по тексту программы и, встретив декларацию функции "foo_A(void)class_const", заносит ее первой в стек;
а дальше по п. 2)
берет с вершины стека foo_A(void)class_const и переходит к ее телу (информация о том, где оно , уже имеется после первого прохода):
void C_A::foo_A(void)const
{
    m_pB->foo_B();
}

в теле видит вызов функции void foo_B(void), потому заносит его сигнатуру в стек; и т.д.

в каком месте он может споткнуться?

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