LINUX.ORG.RU

Узнать размер объекта в C++ по его vtable

 


1

2

Собственно есть подобный код:

class Obj 
{public:  
};

class P: public Obj {
public: P() {}
    
};

class O: public Obj { 
    int x = 42;
public: O() {}
};

void foo(Obj* obj) {
    auto size = ????(obj);
}

Могу ли я как то получить в функции foo размер объекта который является аргументом? Например при foo(new O()) я ожидаю получить sizeof(int)

У тебя в примере вообще нет виртуальных функций. Соответственно, и vtable строится не из чего.

А так ты можешь добавить виртуальную функцию, возвращающую sizeof.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от guixoid

У классов в C++ минимальный размер sizeof(char). С виртуальными функциями sizeof(void*).

Так же в размере играет роль выравнивание данных.

8 - это указатель на vtable.

Ну и в каждом наследнике должна быть объявлена своя size_t get_size() override. Иначе виртуальная функция будет вызываться для базового класса и возвращать его размер.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от Ivan_qrt

надо еще деструктор виртуальный. этот vtable спавнится в том же объектнике, что и деструктор, а если его нету - жди беды при линковке.

example_cat ()
Ответ на: комментарий от Ivan_qrt

Пппц, я вначале подумал, что это фрактал начал по c++ шпарить. Нельзя же так.

ox55ff ★★★★★ ()
Ответ на: комментарий от Ivan_qrt

Удваиваю вопрос, что за ерунда с авами, нафига вы клоунаду устроили? Уже как минимум у трёх пользователей одна ава, нельзя же так, ну, мужики.

anonymous ()
Ответ на: комментарий от crutch_master

Наскриншотили бы разных на порнхабе.

anonymous ()
Ответ на: комментарий от Ivan_qrt

У классов в C++ минимальный размер sizeof(char). С виртуальными функциями sizeof(void*).

Можешь дать ссылочку на стандарт.

rumgot ★★★★★ ()
Ответ на: комментарий от guixoid
class Obj
{
public:
    virtual size_t get_size()
    {
        return sizeof(decltype(*this));
    }
};

guixoid (27.08.19 15:58:57)

В данном случае слишком сложно, тут decltype не нужен:

class Obj
{
public:
    // Как упоминалось, в производных должны
    // быть свои методы get_size()
    virtual size_t get_size()
    {
        return sizeof(Obj);
        // или
        // return sizeof(*this);
    }
    // Виртуальный деструктор, куда же без него
    virtual ~Obj() {}
};

rumgot ★★★★★ ()
Ответ на: комментарий от rumgot

А про размер с виртуальными функциями. Это зависит от реализации. Стандартом, вроде как, не описано. Но все делают отдельный vtable и указатель на него в классе.

Ivan_qrt ★★★★★ ()
Ответ на: комментарий от Ivan_qrt

Нашел в черновике C++11 стандарта:

1.8 The C ++ object model
5 Unless it is a bit-field (9.6), a most derived object shall have a non-zero size and shall occupy one or more bytes of storage. Base class subobjects may have zero size. An object of trivially copyable or standard-layout type (3.9) shall occupy contiguous bytes of storage.

9 Classes
4 Complete objects and member subobjects of class type shall have nonzero size.107 [ Note: Class objects can be assigned, passed as arguments to functions, and returned by functions (except objects of classes for which copying or moving has been restricted; see 12.8). Other plausible operators, such as equality comparison, can be defined by the user; see 13.5. — end note ]

Хотя конечно тут не сказано, что в случае пустого класса должен быть именно один байт.

rumgot ★★★★★ ()
Последнее исправление: rumgot (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.