Подтвердить что ты не робот

С++ sizeof() класса с функциями

У меня вопрос на С++. Я написал следующий класс:

class c
{
    int f(int x, int y){ return x; }
};

sizeof() класса c возвращает "1". Я действительно не понимаю, почему он возвращает 1.

Попытавшись лучше понять, что происходит, я добавил еще одну функцию:

class c
{
     int f(int x, int y){ return x; }
     int g(int x, int y){ return x; }
};

Теперь я действительно смутился! sizeof (c) все еще 1 (!?!?!?!). Поэтому я предполагаю, что функции не меняют размер класса, но почему??? и почему размер равен 1? И специфичен ли этот компилятор?

Спасибо!: -)

4b9b3361

Ответ 1

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

Ответ 2

Он имеет размер 1, потому что он не может быть 0, в противном случае два объекта этого типа не были бы адресуемыми (не могли различать их адреса)

Ответ 3

Функции-члены, по сути, такие же, как и обычные функции, они просто получают скрытый параметр this. Поэтому каждому экземпляру данного типа не нужно переносить копии своих функций-членов; компилятор просто отслеживает регулярные функции и предоставляет подходящий параметр this для вас. Поэтому, независимо от того, сколько функций имеет данный тип, нет необходимости изменять его размер. Когда вы попадаете в сложное наследование с виртуальными функциями и еще много чего, это немного меняется, но в конце число функций продолжает не влиять на конечный размер объекта.

Исходный размер одного байта состоит в том, что все объекты должны занимать некоторое пространство, так что вы можете гарантировать, что два объекта не занимают одно и то же пространство. Рассмотрим массив... a[5] - это то же самое, что и *(a + 5), и добавление к указателю увеличивает адрес памяти по размеру объекта. если sizeof(a) были 0, тогда все элементы массива рухнули бы вниз до одного и того же адреса.

То, что тип объектов некоторого пространства задан стандартом..., чтобы размер был равен точно одному, не является. sizeof(c) в вашем случае может быть 23, но нет причин для этого.

Для полноты возможно, что под-объект имеет размер нуля. Пустая оптимизация базы позволяет базовому классу не занимать никакой реальной памяти, если это не нужно. Таким образом, sizeof(Base) == sizeof(Derived) может быть правдой, хотя формально Derived содержит экземпляр Base, скрытый внутри него. Это разрешено стандартом, но не обязательным для него... MSVC, например, не использует его в некоторых ситуациях.

Ответ 4

1 означает 1 байт. И резонанс заключается в том, что методы не сохраняются внутри объекта. Они используются объектами, но не сохраняются в них. Только объекты класса хранятся в объектах. Попробуйте добавить простой элемент int или что-то еще и посмотреть, что произойдет.

Ответ 5

sizeof (char) == 1 всегда, потому что char является байтом, а sizeof возвращает число байтов. (Тем не менее, байт не обязательно ровно восемь бит.)

Абсолютно верно. Следовательно, термин "октет" (чтобы отличить то, что является точно 8 бит от более часто используемого термина "байт" ).

Для получения дополнительной информации см. IEEE 1541:

http://en.wikipedia.org/wiki/IEEE_1541

Ответ 6

Q: Виртуальные функции занимают пространство на основе каждого объекта и, следовательно, увеличивают размер объекта?

A: Нет. Чем больше виртуальных функций, тем больше vtable. Чем больше подклассов, тем больше vtables. Если класс не имеет виртуальных функций, то нет необходимости использовать либо vtable, либо указатель vtable для каждого объекта.

Но ничто из этого не влияет на "sizeof". Сами функции занимают фиксированное количество свободного места.

Ответ 7

Поскольку ваш класс является "ссылочной переменной" и для MSDN: "Оператор sizeof никогда не дает 0 даже для пустого класса".

Пример:


#include <stdio.h>

class c { public: int f(int x, int y){ return x; } int g(int x, int y){ return x; } };

struct s { int f; int g; };

int main (int argc, char *argv[]) { c objc; s objs; printf ("sizeof (c)= %d, sizeof (objc)= %d, sizeof (class c)= %d...\n", sizeof (c), sizeof (objc), sizeof (class c)); printf ("sizeof (s)= %d, sizeof (objs)= %d, sizeof (struct s)= %d...\n", sizeof (s), sizeof (objs), sizeof (struct s)); return 0; }

РЕЗУЛЬТАТ:

sizeof (c)= 1, sizeof (objc)= 1, sizeof (class c)= 1...
sizeof (s)= 8, sizeof (objs)= 8, sizeof (struct s)= 8...

Заметьте также разницу между "struct" и "class".

Здесь больше информации:

http://www.geekinterview.com/question_details/42847