2015-02-10 8 views
2

Есть ли общий способ (не зависящий от платформы) получить во время компиляции размер объекта класса в памяти, не считая указателей vtable?Определить размер объекта без его указателей виртуальных таблиц

+3

Что случилось с 'sizeof'? Он не включает размер vtable, только размер указателя на vtable, если таковой имеется. – dasblinkenlight

+0

Вычитание? Что делать, если их больше? – Reflection

+1

Из любопытства: зачем? – Angew

ответ

1

Как вы просите переносимым способом:

class MyClass 
{ 
private: 
    struct S 
    { 
    DataMemberType1 dataMember1; 
    ... 
    DataMemberTypeN dataMemberN; 
    } m; 

public: 
    static const size_t MemberSize = sizeof(S); 
}; 
+0

Вы уверены, что это 100% портативный и 'sizeof (MyClass) - sizeof (S) 'всегда будет точно соответствовать размеру vpointer? –

+0

@Neil: Мое решение позволяет избежать конкретных деталей реализации. Кратко взгляните на «Как объекты C++ выложены в памяти?» [Ссылка] (http://www.stroustrup.com/bs_faq2.html#layout-obj). –

+0

Это не отвечает на мой вопрос .. что делать, если есть набивка? –

1

Используйте sizeof на этом class, он не включает в себя размер vtable только указатель.

+1

Я говорил о указателе vtable. Вопрос отредактирован. – Reflection

+0

@PaulEvans Ваш ответ неверен для любого объекта, который имеет виртуальные функции (любой объект, фактически содержащий vtable.) Http://ideone.com/7y48aO –

+0

@JonathanMee Ответ правильный; класс содержит vptr (сокращение для указателя vtable) ** не ** vtable (таблица указателей функций для виртуальных функций класса + RTTI info + смещение виртуальных баз) – curiousguy