Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
#1

sizeof для класса - C++

21.08.2013, 08:49. Просмотров 766. Ответов 7
Метки нет (Все метки)

Создаем класс в котором только одна переменная типа int

C++
1
2
3
4
5
class MyClass
{
private:
    int n;
};
sizeof(MyClass) для этого класса печатает 4, т.к. int занимает в памяти 4 байта

C++
1
2
3
4
int main()
{
    std::cout << sizeof(MyClass);       // 4
}

---------------------------------------------------------------------

Теперь в класс добавим конструктор, деструктор и несколько функций

C++
1
2
3
4
5
6
7
8
9
10
11
12
class MyClass
{
public:
    MyClass(int i)      { n = 1; }
    ~MyClass()          {}
 
    void Set(int i)     { n = i; }
    int Get()           { return n; }
 
private:
    int n;
};
sizeof(MyClass) опять печатает 4:

C++
1
2
3
4
int main()
{
    std::cout << sizeof(MyClass);       // 4
}
Вот тут мне как раз и непонятно, почему результат sizeof(MyClass) один и тот же?
Ведь функции тоже занимают место в памяти
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2013, 08:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос sizeof для класса (C++):

Sizeof(.) или constexpr size_t tmp = sizeof(.) - C++
sizeof(...) или constexpr size_t tmp = sizeof(...) Как лучше с точки зрения производительности? правильности?

Fwrite (buffer , sizeof(char), sizeof(buffer), pFile) - C++
как записать часть массива чаров? допустим у нас arr; мне надо записать с позиции массива 500 до 600, 100 байтов как записать эту...

Для чего нужен Sizeof - C++
Вот строка memcpy(pMatrPr, pMatr, sizeof(double) * n * m); Это копирование исходной матрицы в преобразованную А что такое...

sizeof для пустой структуры - C++
Есть такая небольшая программа #include &quot;iostream&quot; int main() { struct inf { }; cout &lt;&lt; sizeof(inf); // печатает...

sizeof( char * ) & sizeof(char) - C++
Здравствуйте, не могу понять почему sizeof(char *) = 4 а sizeof(char) = 1. Ну с последним ясно , а вот с первым непойму... Может кто-то...

Создать для класса виртуальный метод, возвращающий уникальный идентификатор класса - C++
В курсаче по ООП сказано создать для класса виртуальный метод,возвращающий уникальный идентификатор класса. Вопрос в том, что это такое?

7
Croessmah
Эксперт CЭксперт С++
13412 / 7563 / 855
Регистрация: 27.09.2012
Сообщений: 18,614
Записей в блоге: 3
Завершенные тесты: 1
21.08.2013, 08:53 #2
Цитата Сообщение от BigLow Посмотреть сообщение
почему результат sizeof(MyClass) один и тот же?
Потому что ничего не поменялось. Как требовалось для объекта 4 байта, так и осталось.
Цитата Сообщение от BigLow Посмотреть сообщение
Ведь функции тоже занимают место в памяти
То есть по Вашему они должны увеличивать размер объектов?
С чего вдруг, это же просто функции?
0
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
21.08.2013, 09:00  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
То есть по Вашему они должны увеличивать размер объектов?
думаю, должны.

Цитата Сообщение от Croessmah Посмотреть сообщение
С чего вдруг, это же просто функции?
А где записаны в памяти? Все эти функции находятся внутри класса. Еще в этих функциях есть локальные переменные. Они уж точно где-то записаны и занимаю место

Непонятно
0
eXtream
24 / 24 / 0
Регистрация: 10.03.2010
Сообщений: 161
21.08.2013, 09:21 #4
На сколько я помню, таблица адресов функций-членов находиться в другом месте, и при создании объекта под них кажды раз не распределяеться память и это логично.

Добавлено через 3 минуты
А sizeof возвращает размер области данных
1
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
21.08.2013, 09:28  [ТС] #5
eXtream, спасибо
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
21.08.2013, 10:21 #6
А еще же таблица виртуальных функций есть.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
class One {
 public:
  One() {}
  int getX() const { return x; }
 private:
  int x;
};
 
class AnotherOne {
 public:
  AnotherOne() {}
  virtual int getX() const { return x; }
 private:
  int x;
};
 
int main(int, char**) {
  std::cout << "One weight " << sizeof(One) << " bytes, but "
    "AnotherOne is " << sizeof(AnotherOne) << " bytes." << std::endl; 
}
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,274
Записей в блоге: 2
Завершенные тесты: 1
21.08.2013, 11:37 #7
Цитата Сообщение от BigLow Посмотреть сообщение
думаю, должны.
Т.е. по твоему логично, что для каждого объекта существует своя копия функции? Т.е. если мы имеем массив из 1000 объектов, то в исполняемом файле будет существовать 1000 копий одной и той же функции? Конечно же нет, функции вынесены в отдельное место и по сути являются обычными функциями (как любая другая), отличие их в том, что область видимости у них ограничена классом (т.е. могут вызываться либо из другой функции класса, либо для объекта класса).
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 12:25 #8
Цитата Сообщение от BigLow Посмотреть сообщение
Ведь функции тоже занимают место в памяти
В памяти, но не в объекте.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 12:25
Привет! Вот еще темы с ответами:

Перегрузка оператора >> для дочернего класса от базового виртуального класса - C++
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на поиск ответа в глубинах учебников,...

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса - C++
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B и obj_B = obj_A? Добавлено через 9...

Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка - C++
Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка. Всем огромное спасибо за помощь! |

Задачка для новичков #2: вывести в методе класса-родителя значение данных-членов из дочернего класса - C++
Вдохновленный соседней темой тоже решил задать свой вопрос таким же начинающим программистам как и я :) Все кто хочет попробовать дать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
21.08.2013, 12:25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru