55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
1

sizeof для класса

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

Author24 — интернет-сервис помощи студентам
Создаем класс в котором только одна переменная типа 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2013, 08:49
Ответы с готовыми решениями:

Правильно ли определять размер объекта класса операцией sizeof?
будет ли правильно определить размер объекта класса операцией sizeof() ? чойто у меня неадекватные...

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

Fwrite (buffer , sizeof(char), sizeof(buffer), pFile)
как записать часть массива чаров? допустим у нас arr; мне надо записать с позиции массива 500 до...

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

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

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

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

Добавлено через 3 минуты
А sizeof возвращает размер области данных
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
21.08.2013, 09:28  [ТС] 5
eXtream, спасибо
0
4744 / 2556 / 888
Регистрация: 29.11.2010
Сообщений: 5,525
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
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,112
Записей в блоге: 2
21.08.2013, 11:37 7
Цитата Сообщение от BigLow Посмотреть сообщение
думаю, должны.
Т.е. по твоему логично, что для каждого объекта существует своя копия функции? Т.е. если мы имеем массив из 1000 объектов, то в исполняемом файле будет существовать 1000 копий одной и той же функции? Конечно же нет, функции вынесены в отдельное место и по сути являются обычными функциями (как любая другая), отличие их в том, что область видимости у них ограничена классом (т.е. могут вызываться либо из другой функции класса, либо для объекта класса).
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 12:25 8
Цитата Сообщение от BigLow Посмотреть сообщение
Ведь функции тоже занимают место в памяти
В памяти, но не в объекте.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2013, 12:25
Помогаю со студенческими работами здесь

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

Является ли оператор sizeof синтаксическим сахаром над System.Runtime.InteropServices.Marshal.SizeOf?
Является ли оператор sizeof синтаксическим сахаром над...

Что обозначает строка вида sizeof(data)/sizeof(data[0])?
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; void bubble_sort(float *data, int size) { int i,j; ...

Marshal.SizeOf и sizeof
чем отличаются Marshal.SizeOf и sizeof? я просто почему то привык пользоваться Marshal.SizeOf, так...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru