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

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

Войти
Регистрация
Восстановить пароль
 
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
#1

Размер объекта? - C++

01.02.2013, 15:00. Просмотров 889. Ответов 9
Метки нет (Все метки)

При работе с объектами, совсем не знал забыл следующие моменты:
  1. Зависит ли размер объекта от количества в нем методов ?
  2. Будет ли метод скомпилирован в исполняемый файл или dll, если не используется в коде ?
  3. Статический метод единожды увеличивает размер класса (или объекта ?)
  4. Функция не инлайниться в Release версии вижлы, с чем это может быть связанно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2013, 15:00     Размер объекта?
Посмотрите здесь:

Размер объекта - C++
Только что прочитал такую статью - http://devdoc.web-ide.ru/index.php/content/view/virtual_base.htm И там написано "Создание объекта –...

Размер объекта в байтах - C++
Разъясните пожалуйста следующую ситуацию. Почему при таком class A { int x; int y; double a; }; и таком...

Размер объекта со всеми вложениями - C++
Как узнать сколько в оперативной памяти занимает обьект со всеми обьектами которые были в нём инициализированы?

Как узнать размер объекта класса? - C++
Здравствуйте, Дамы и Господа! Есть ли функция, передающая значение количества байт, отведенных в памяти для объекта класса? Например...

размер класса - C++
Всем привет! Извините за нубский вопрос: как определить размер класса в режиме #pragma pack(1) и без него. (цитата из задания) ...

размер vector'a - C++
как узнать размер двумерного вектора отдельно по вертикали и горизонтали

Размер файла... - C++
Ищу функцию которая возвращает размер файла в строковом виде... Например: 4 -4 б 1041 - 1,017 Кб и.т.д.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
01.02.2013, 15:09     Размер объекта? #2
Цитата Сообщение от vbloodv Посмотреть сообщение
Зависит ли размер объекта от количества в нем методов ?
Только если они виртуальные. Тогда от их количества зависит размер таблицы указателей виртуальных функций.

Цитата Сообщение от vbloodv Посмотреть сообщение
Функция не инлайниться в Release версии вижлы, с чем это может быть связанно?
Определение функции написано в объявлении класса? Если да, то м.б. такие особенности компилятора. Он посчитал, что инлайнить её нельзя. Много может быть причин. Если же нет - то он как бы и не обязан.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
01.02.2013, 20:52     Размер объекта? #3
Тогда от их количества зависит размер таблицы указателей виртуальных функций
Таблица одна, в экземплярах хранится лишь указатель на таблицу, размер указателя меняться не может.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
01.02.2013, 21:00     Размер объекта? #4
vbloodv, 3 static-методы не имеют отношения к объектам и не могут влиять на их размер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
class A
{
public:
   static void f() { std::cout << "A::f" << std::endl; }
};
 
int main()
{
   A* obj = NULL;
   obj->f();
 
   return 0;
}
MrGluck
Модератор
Эксперт CЭксперт С++
7161 / 4327 / 630
Регистрация: 29.11.2010
Сообщений: 11,750
01.02.2013, 22:12     Размер объекта? #5
4. Компилятор посчитал, что функцию не нужно делать inline.

Добавлено через 8 минут
Если использовать оператор ::new, то при выделении памяти он дополнительно в блок запишет сколько памяти было выделено для корректного удаления оператором ::delete. Для динамически создаваемого объекта блок будет увеличиваться в зависимости от количества виртуальных функций (прямо пропорционально).
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
01.02.2013, 22:20     Размер объекта? #6
зачем блоку увеличиваться. написали уже, что таблица виртуальных функций - одна на все экземпляры класса. такая статическая константа. под нее память не надо выделять для каждого объекта. в объектах для этого указатель на эту таблицу есть.
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
01.02.2013, 23:27  [ТС]     Размер объекта? #7
Тогда я так понимаю, условно когда класс компилируется это все компоновщик собирает в файл obj, а сами созданные объекты вызывают функции уже из этого класса и имеют при себе список адресов виртуальных функций что незначительно увеличивает его размер. Следовательно объем объекта:
сумма величин инициализированных полей + несколько системных байт + таблица виртуальных функций
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
02.02.2013, 00:21     Размер объекта? #8
никакие системные байты не являются частью объекта.
размер объекта складывается из размера полей + (размер указателя) * (количество указателей на таблицы виртуальных функций если они есть) + может быть добавлено выравнивание. именно указатели на таблицы, а не сами таблицы. у указателей фиксированный размер. от количества виртуальных функций размер объекта не зависит. хоть одна, хоть сто. размер будет один. если их нет вообще, то тогда в объекте не будет указателя и конечно же размер его будет другим. так же размер не зависит от количества невиртуальных функций, от количества статических функций, от количества статических мемберов.
ну и по проверять это можно примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
 
class C0
{
    void f1() {}
    void f2() {}
    void f3() {}
    void f4() {}
    void f5() {}
    void f6() {}
    void f7() {}
};
 
class C1
{
    virtual void f1() {}
};
 
class C2
{
    virtual void f1() {}
    virtual void f2() {}
    virtual void f3() {}
    virtual void f4() {}
    virtual void f5() {}
    virtual void f6() {}
    virtual void f7() {}
    virtual void f8() {}
    virtual void f9() {}
};
 
class C3
{
    int i;
};
 
class C4
{
    int i;
    char ch;
};
 
class C5
{
    int i;
    char ch1;
    char ch2;
    char ch3;
    char ch4;
};
 
int main()
{
    std::cout << "sizeof(C0) = " << sizeof(C0) << std::endl;
    std::cout << "sizeof(C1) = " << sizeof(C1) << std::endl;
    std::cout << "sizeof(C2) = " << sizeof(C2) << std::endl;
    std::cout << "sizeof(C3) = " << sizeof(C3) << std::endl;
    std::cout << "sizeof(C4) = " << sizeof(C4) << std::endl;
    std::cout << "sizeof(C5) = " << sizeof(C5) << std::endl;
    return 0;
}
MrGluck
Модератор
Эксперт CЭксперт С++
7161 / 4327 / 630
Регистрация: 29.11.2010
Сообщений: 11,750
02.02.2013, 01:35     Размер объекта? #9
Цитата Сообщение от DU Посмотреть сообщение
sizeof(C0)
уверены, что таким образом можно проверить сколько байтов идет перед записью самого объекта?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2013, 11:09     Размер объекта?
Еще ссылки по теме:

Размер матрицы - C++
Люди, помогите пожалуйста! У меня есть задание: создать библиотеку функций для работы с матрицами. Можно ли сделать ,так что в...

Размер байта - C++
Есть ли он в std::numeric_limits? Гарантирует ли стандарт какому либо типу разрядность 1 байт?

Размер вектора - C++
День добрый. У меня проблема. Нужно объявить вектор, заполнить его случайными числами в диапазоне от -50 до 50, вывести в listbox1....

Размер вектора - C++
Подскажите функцию для класса vector, которая будет возвращать размер памяти, который занимает вектор.

Размер файла - C++
Добрый день , нужно получить размер файла мой код пишет что-то не внятное значение 1787408944 #include &lt;sys/stat.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
02.02.2013, 11:09     Размер объекта? #10
да, уверен, если мы говорим о размере объекта.
если речь идет о том, сколько там выделяется дополнительных байт при new чтобы потом корректно удалить - это уже другое.
Yandex
Объявления
02.02.2013, 11:09     Размер объекта?
Ответ Создать тему
Опции темы

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