Форум программистов, компьютерный форум, киберфорум
Наши страницы

В дизассемблерованном коде отсутствует позднее связывание. Оптимизация? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ CRITICAL_SECTION 2 потока http://www.cyberforum.ru/cpp/thread329323.html
Задача заставить 2 потока работать точно друг за другом(по очереди): main() { /*инициализация*/ EnterCriticalSection( &cs );//блокировка первого потока EnterCriticalSection( &cs2...
C++ Работа с формами Будьте добры. Подскажите , как вписать код в формы? Чтобы , когда я делаю кнопочки, они делали то, что я хочу. Понимаю, что тема широкая, поэтому может кто ресурс укажет. В поисковике никак грамотно ... http://www.cyberforum.ru/cpp/thread329288.html
C++ В конец целочисленного двоичного файла дописать нечетные значения, содержащиеся в другом целочисленном текстовом файле
Дано такое задание: Дописывание в файл. В конец целочисленного двоичного файла дописать нечетные значения, содержащиеся в другом целочисленном текстовом файле. Итоговый файл должен иметь строго...
C++ База на Code Blokcs C++
Помогите дописать практику с базой, проверьте написанный код и помогите добавить, вывод из файла, редактирование по id(vuz) и удаление (group). если можно с коментариями #include <stdio.h>...
C++ Программы по умолчанию для расширений http://www.cyberforum.ru/cpp/thread328103.html
Кто знает подскажите, каким образом можно изменить программу по умолчанию для расширений в с\с++, да и не важно в чем. Системных утилит, программ я не нашел которые могут это делать, что бы в...
C++ События в ANSI C++ Прошу прощенья, что не очень внятно формулирую тему. Для меня это познавательный вопрос. Меня интересует: 1)Можно ли и как в классическом C++ без всяких GUI (C++ Builder, Visual Studio)... подробнее

Показать сообщение отдельно
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,356
Записей в блоге: 2
Завершенные тесты: 1

В дизассемблерованном коде отсутствует позднее связывание. Оптимизация? - C++

06.07.2011, 19:14. Просмотров 488. Ответов 2
Метки (Все метки)

Добрый день/утро/вечер (нужное подчеркнуть))
Выдалось свободное время и решил немного пописать марсианского кода) В процессе написания пришлось лезть в дизассемблированный листинг и вот, что я там обнаружил - отсутствует позднее связывание для виртуальных функций. Чтоб было понятно о чем речь - вот код:
C++
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
27
28
29
#include<iostream>
class X{
public:
    virtual void f(){std::cout<<"fX\n";}
    virtual void F(){std::cout<<"FX";}
    X(){
        f();
    }
};
class Y:public X{
public: 
        void f(){std::cout<<"fY\n";}
    void F(){std::cout<<"FY\n";}
    Y(){
        f();
    }
 
};
 
 
 
 
int main() {
 Y a;
 a.F();
 void (***ptr)()=(void (***)())&a;
 (**ptr)();//привет 
 (**(*ptr+1))();//с Марса ))
}
Вот, что происходит при вызове a.F():
Assembler
1
2
3
   ;a.F();
   lea         ecx,[a]  
   call        Y::F (1091249h)
т.е. адрес виртуальной функции Y::F() уже известен на стадии компиляции
Так что это - компилятор решил не заморачиваться и вычислил адрес нужной ф-ции (ну типа, код маленький, функций всего две, что я буду лишний код создавать...)) или что-то другое (всмысле может я чего не понимаю) ?

Добавлено через 8 минут
Блин, после сессии глова кругом, туплю...
Вот так будет позднее связывание:
C++
1
2
X *a=new Y;
 a->F();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru