2014-01-18 3 views
0

Предположим, что у меня есть простые классы/структуры без каких-либо данных, кроме данных и нескольких операторов. Если я понимаю, базовая структура с только данными на C++, как и C, занимает столько же памяти, сколько и члены. Например,ли методы оператора занимают память в объектах C++?

Что мне интересно, если добавление операторов в класс сделает объект более крупным в памяти. Например

struct SomeStruct 
{ 
public: 
    SomeStruct & operator=(const float f) { data = f; return this; } 
private: 
    float data; 
} 

это будет по-прежнему верно, что sizeof(SomeStruct) == sizeof(float) оценивается как истина? Существуют ли какие-либо операторы/методы, которые не будут увеличивать размер объектов в памяти?

ответ

2

Что мне интересно, если добавление операторов в класс сделает объект более крупным в памяти.

Ответ «это зависит».

Если класс не был полиморфным до добавления функции, и эта новая функция сохраняет класс не полиморфным, то добавление этой неполиморфной функции ничего не делает для размера экземпляров вашего класса.

С другой стороны, если добавление этой новой функции делает ваш класс полиморфным, это дополнение сделает экземпляры вашего класса более крупными. Большинство реализаций на C++ используют виртуальную таблицу, или vtable для краткости. Каждый экземпляр полиморфного класса содержит указатель на vtable для этого класса. Экземпляры не полиморфных классов не нужны и, следовательно, не содержат указателя vtable.

Наконец, добавление еще одной виртуальной функции к классу, который уже является полиморфным, не делает экземпляры классов больше. Это добавление делает vtable для этого класса более крупным, но сам vtable не является частью экземпляра. Указатель vtable является частью экземпляра, и этот указатель уже является частью макета класса, потому что класс уже является полиморфным.

3

структура не обязательно может быть только как большой, как его членов (рассмотреть отступы и выравнивание), но вы в основном правильно, в том, что:

функции не являются данными, а не «хранятся» внутри тип объекта.

Сказанное: обратите внимание на добавление виртуальных указателей на таблицы в том случае, если вы добавляете виртуальную функцию к вашему типу. Это одноразовый рост размера для типа и не применяется повторно при добавлении дополнительных виртуальных функций.

+0

Что относительно виртуальных функций? – SirGuy

+0

@GuyGreer: Ну, ладно, у вас есть vtable для рассмотрения в некоторых реализациях. Но сами функции никогда не хранятся в объекте. –

+0

Можете ли вы объяснить, что вы подразумеваете под дополнением и выравниванием? Есть ли какая-нибудь причина, например, 'SomeStruct structArray [100]' будет иметь другой размер от 'float floatArray [100]'? – xaviersjs

-1

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

Код метода хранится в одном центральном месте, а C++ просто выглядит так, как если бы каждый экземпляр имел свои методы внутри него. (Операторы - это, по сути, функции с различным синтаксисом).

Методы и операторы, определенные внутри классов, не увеличивают размер создаваемых объектов. Вы можете проверить это сами:

#include <iostream> 
using namespace std; 

struct A { 
    int a; 
}; 
struct B { 
    int a; 
    //SOME RANDOM METHODS AND OPERATORS 
    B() : a(1) {cout<<"I'm the constructor and I set 'a' to 1"<<endl;} 
    void some_method() const { for(int i=0;i<40;i++) cout<<"loop";} 
    B operator+=(const B& b){ 
    a+=b.a; 
    return *this; 
    } 
    size_t my_size() const { return sizeof(*this);} 


}; 

int main(){ 

cout<<sizeof(A)<<endl; 
cout<<B().my_size()<<endl; 

} 

Выход на 64 битной системе:

4 
I'm the constructor and I set 'a' to 1 
4 

==> Без изменений размера.

+0

Что это за downvote? Что я не упоминал о том, как ситуация меняется с помощью виртуальных функций? : / – PSkocik

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