2014-10-06 6 views
-6

ВНИМАНИЕ: Пожалуйста, имейте в виду, что этот вопрос неверен - он ошибочно полагает, потому что я неправильно истолковал плохо написанный учебник (на самом деле книгу) на C++. Для случая вы любопытны, это оригинальное содержание:Использование виртуальных методов памяти Java vs C++

В C++ маркировка метод как виртуальные причины объектов использовать больше памяти - для каждого дополнительного виртуального метода памяти для указателя (4 - 8 байт) Больше. Как работает Java с этим, где все методы по умолчанию являются виртуальными?

+0

Простой вопрос, но никто, кажется, беспокоит даже комментировать то, что случилось с ним. Надеюсь, что это не ненависть к Java. – spectre

+1

Вы ошибаетесь. В C++ есть одна таблица виртуальных методов для класса, а не экземпляра. – talex

+0

Прежде всего, можете ли вы дать ссылку, где написано, что «для каждого дополнительного виртуального метода больше памяти для указателя (4 - 8 байт) больше». –

ответ

0

Ваше основное допущение неверно. Размер объекта не увеличивается с количеством виртуальных функций.

Если класс имеет ЛЮБЫЕ виртуальные функции, то он имеет единственный указатель на таблицу vtable для этого класса. Размер объекта не изменится за того, что независимо от того, сколько виртуальных функций:

struct s0 {}; 

struct s1 
{ 
    virtual void f1() {} 
}; 

struct s2 
{ 
    virtual void f1() {} 
    virtual void f2() {} 
}; 

struct s3 
{ 
    virtual void f1() {} 
    virtual void f2() {} 
    virtual void f3() {} 
}; 

int main() 
{ 
    std::cout << "s0: " << sizeof(s0) << '\n'; 
    std::cout << "s1: " << sizeof(s1) << '\n'; 
    std::cout << "s2: " << sizeof(s2) << '\n'; 
    std::cout << "s3: " << sizeof(s3) << '\n'; 
} 

РЕЗУЛЬТАТЫ:

s0: 1 
s1: 8 
s2: 8 
s3: 8 
+0

Я сделал точно такой же предмет. – spectre

0

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

+0

Книга, которую я читаю, не совсем понятна. – spectre

Смежные вопросы