Как подавить генерацию v ++ Ctable для чисто виртуальных классов, использующих G ++? - PullRequest
8 голосов
/ 04 декабря 2011

Подавление генерации V ++ C ++ можно выполнить в MSVC с помощью атрибута __declspec(novtable).Однако, похоже, что нет эквивалентного атрибута для компилятора GNU C ++.Дело в том, что оставляя vtables для чисто виртуальных классов излишне ссылки в __cxa_abort() и многих других, и я хочу избежать этого, потому что я программирую для встроенной системы.Итак, что мне делать?

struct ISomeInterface
{
    virtual void Func() = 0;
};

class CSomeClass : public ISomeInterface
{
    virtual void Func();
}

void CSomeClass::Func()
{
    //...
}

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

Есть нечто, что приведет к аналогичному результату: #pragma interface.
#pragma implementation может переопределить это, однако.
http://www.emerson.emory.edu/services/gcc/html/CPP_Interface.html

0 голосов
/ 24 апреля 2013

Флаг компилятора -fno-rtti останавливает генерацию информации о типе во время выполнения.

По моему опыту работы с C ++ на встроенных платформах, это предотвратило возникновение ошибок компилятора vtable, предполагая, что оно предотвращает их создание (и, следовательно, виртуальные функции не будут работать).

...