Есть ли общий способ (не зависящий от платформы) получить во время компиляции размер объекта класса в памяти, не считая указателей vtable?Определить размер объекта без его указателей виртуальных таблиц
ответ
Как вы просите переносимым способом:
class MyClass
{
private:
struct S
{
DataMemberType1 dataMember1;
...
DataMemberTypeN dataMemberN;
} m;
public:
static const size_t MemberSize = sizeof(S);
};
Вы уверены, что это 100% портативный и 'sizeof (MyClass) - sizeof (S) 'всегда будет точно соответствовать размеру vpointer? –
@Neil: Мое решение позволяет избежать конкретных деталей реализации. Кратко взгляните на «Как объекты C++ выложены в памяти?» [Ссылка] (http://www.stroustrup.com/bs_faq2.html#layout-obj). –
Это не отвечает на мой вопрос .. что делать, если есть набивка? –
Используйте sizeof
на этом class
, он не включает в себя размер vtable
только указатель.
Я говорил о указателе vtable. Вопрос отредактирован. – Reflection
@PaulEvans Ваш ответ неверен для любого объекта, который имеет виртуальные функции (любой объект, фактически содержащий vtable.) Http://ideone.com/7y48aO –
@JonathanMee Ответ правильный; класс содержит vptr (сокращение для указателя vtable) ** не ** vtable (таблица указателей функций для виртуальных функций класса + RTTI info + смещение виртуальных баз) – curiousguy
Что случилось с 'sizeof'? Он не включает размер vtable, только размер указателя на vtable, если таковой имеется. – dasblinkenlight
Вычитание? Что делать, если их больше? – Reflection
Из любопытства: зачем? – Angew