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

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

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

Как узнать размер объекта класса? C++
Размер объекта в байтах C++
Как правильно вызывать функцию объекта из другой функции того же объекта? C++
C++ Требуется ли при удалении объекта посредством delete указывать тип объекта?
При возврате объекта из функции пишет, что для объекта не определен констуктор копирования C++
C++ Размер объекта
Ввести размер массива с клавиатуры и передать этот размер в конструктор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
01.02.2013, 15:09     Размер объекта? #2
Цитата Сообщение от vbloodv Посмотреть сообщение
Зависит ли размер объекта от количества в нем методов ?
Только если они виртуальные. Тогда от их количества зависит размер таблицы указателей виртуальных функций.

Цитата Сообщение от vbloodv Посмотреть сообщение
Функция не инлайниться в Release версии вижлы, с чем это может быть связанно?
Определение функции написано в объявлении класса? Если да, то м.б. такие особенности компилятора. Он посчитал, что инлайнить её нельзя. Много может быть причин. Если же нет - то он как бы и не обязан.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
01.02.2013, 20:52     Размер объекта? #3
Тогда от их количества зависит размер таблицы указателей виртуальных функций
Таблица одна, в экземплярах хранится лишь указатель на таблицу, размер указателя меняться не может.
0x10
2437 / 1609 / 235
Регистрация: 24.11.2012
Сообщений: 3,949
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
Ворчун
Эксперт С++
 Аватар для MrGluck
5584 / 3063 / 344
Регистрация: 29.11.2010
Сообщений: 8,254
01.02.2013, 22:12     Размер объекта? #5
4. Компилятор посчитал, что функцию не нужно делать inline.

Добавлено через 8 минут
Если использовать оператор ::new, то при выделении памяти он дополнительно в блок запишет сколько памяти было выделено для корректного удаления оператором ::delete. Для динамически создаваемого объекта блок будет увеличиваться в зависимости от количества виртуальных функций (прямо пропорционально).
DU
1478 / 1054 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
01.02.2013, 22:20     Размер объекта? #6
зачем блоку увеличиваться. написали уже, что таблица виртуальных функций - одна на все экземпляры класса. такая статическая константа. под нее память не надо выделять для каждого объекта. в объектах для этого указатель на эту таблицу есть.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
01.02.2013, 23:27  [ТС]     Размер объекта? #7
Тогда я так понимаю, условно когда класс компилируется это все компоновщик собирает в файл obj, а сами созданные объекты вызывают функции уже из этого класса и имеют при себе список адресов виртуальных функций что незначительно увеличивает его размер. Следовательно объем объекта:
сумма величин инициализированных полей + несколько системных байт + таблица виртуальных функций
DU
1478 / 1054 / 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
Ворчун
Эксперт С++
 Аватар для MrGluck
5584 / 3063 / 344
Регистрация: 29.11.2010
Сообщений: 8,254
02.02.2013, 01:35     Размер объекта? #9
Цитата Сообщение от DU Посмотреть сообщение
sizeof(C0)
уверены, что таким образом можно проверить сколько байтов идет перед записью самого объекта?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2013, 11:09     Размер объекта?
Еще ссылки по теме:

C++ Передача объекта методу другого объекта другого класса
В строке первого объекта класса слово MAX длины заменить на слово MAX длины второго объекта класса C++
Создание объекта в функции и возврат объекта из нее C++
C++ Размер объекта со всеми вложениями
Вывод данных вложенного объекта из другого объекта C++

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

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

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