Я экспериментировал с виртуальной таблицей и виртуальным указателем. Чтобы узнать больше, я сделал следующее:Доступ к VTABLE напрямую вызывает неопределенную ошибку
//a simple class
class X
{
public:
// fn is a simple virtual function
virtual void fn() { cout << "n = " << n << endl; }
// a member variable
int n;
};
int main()
{
// create an object (obj) of class X
X *obj = new X();
obj->n = 10;
// get the virtual table pointer of object obj
int* vptr = *(int**)obj;
__asm__("mov %eax, obj;");
// function fn is the first entry of the virtual table, so it's vptr[0]
((void (*)()) vptr[0])();
// the above should be the same as the following
//obj->fn();
return 0;
}
Но компилятор дает следующее сообщение об ошибке:
/home/OaVTND/cclnoQaK.o: In function 'main': prog.cpp:(.text.startup+0x26): undefined reference to `obj'
collect2: error: ld returned 1 exit status
Я не знаком с языка ассемблера кода. Я заимствовал это из кода другого тела. Я использую сервер gcc-4.9 и Centos 7 x64 бит.
Ваш встроенный asm разбит несколькими способами (вам необходимо передать адрес obj в качестве входного операнда для встроенной сборки, вы перемещаете произвольное содержимое% eax в obj). Непонятно, чего вы пытаетесь достичь. – yugr
и что вы делаете в __asm__.? –
@GreenTree: он пытается настроить указатель 'this', загружая адрес объекта в EAX. Это нормально - если оператор вызова не случайно использует EAX для вычисления целевого адреса. –