powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / 3 вопроса
21 сообщений из 46, страница 2 из 2
3 вопроса
    #33731967
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас БарабасТ.е. размер объекта - это сколько памяти отвел компилятор для него, так получается


Конечно.
...
Рейтинг: 0 / 0
3 вопроса
    #33731987
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Homosum
это есть такой тест, ответив на который например так:


Где берешь тесты такие ?
...
Рейтинг: 0 / 0
3 вопроса
    #33732007
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
6.
Размер объекта класса в памяти определяется
суммой размеров методов класса и атрибутов класса
суммой размеров методов класса
суммой размеров атрибутов класса
не зависит от размеров атрибутов и методов класса


Правильный ответ - "суммой размеров атрибутов класса".
Понятия "размер метода класса" вообще не существует, у метода нет размера.
...
Рейтинг: 0 / 0
3 вопроса
    #33732163
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv...
Понятия "размер метода класса" вообще не существует, у метода нет размера.Это конечно так, но наличие виртуальных на размер класса влияет.
...
Рейтинг: 0 / 0
3 вопроса
    #33732170
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5. Фрагмент программы
for(i=n-1; i>=0; i--)
for(j=0; j<n-i-1; j++)
a[j]=1;
заполнит элементы квадратной матрицы (n-размерность матрицы)
на главной диагонали
над главной диагональю
над побочной диагональю (!)
на побочной диагонали
под побочной диагональю

- вопрос вообще неправильный. Не понятно, как объявлена a и как в ней (если это одномерный массив) хранится двухмерная матрица - по стобцам или по строкам.
...
Рейтинг: 0 / 0
3 вопроса
    #33732177
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Балтика MasterZiv...
Понятия "размер метода класса" вообще не существует, у метода нет размера.Это конечно так, но наличие виртуальных на размер класса влияет.


Как??? Как наличие виртуальных методов может влиять на размер объекта класса? Наличие виртуальных методов может влиять на накладные расходы памяти по работе с ними - таблицы вирутальных функций и т.д., но не на сам объект класса.
...
Рейтинг: 0 / 0
3 вопроса
    #33732205
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Homosum _Балтика MasterZiv...
Понятия "размер метода класса" вообще не существует, у метода нет размера.Это конечно так, но наличие виртуальных на размер класса влияет.


Как??? Как наличие виртуальных методов может влиять на размер объекта класса? Наличие виртуальных методов может влиять на накладные расходы памяти по работе с ними - таблицы вирутальных функций и т.д., но не на сам объект класса.Как только появляется хотя-бы один вирт. метод класса, в первых четырех байтах объекта класса появляется указатель на его VMT.
...
Рейтинг: 0 / 0
3 вопроса
    #33732470
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если было наследование от нескольких классов с виртуальными методами, по-видимому, будет несколько указателей.
...
Рейтинг: 0 / 0
3 вопроса
    #33732505
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maXmoа если было наследование от нескольких классов с виртуальными методами, по-видимому, будет несколько указателей.Нет, один. Он указывает, на смещение от начала VMT первого родительского класса, имеющего вирт. методы.
...
Рейтинг: 0 / 0
3 вопроса
    #33732518
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Балтика maXmoа если было наследование от нескольких классов с виртуальными методами, по-видимому, будет несколько указателей.Нет, один. Он указывает, на смещение от начала VMT первого родительского класса, имеющего вирт. методы.Извиняюсь, ерунду написяал. У каждого класса своя VMT.
...
Рейтинг: 0 / 0
3 вопроса
    #33732726
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только они, имхо, объединены в одну таблицу, чтобы иметь доступ ко всем методам через один указатель на начало таблицы.
...
Рейтинг: 0 / 0
3 вопроса
    #33733062
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maXmoтолько они, имхо, объединены в одну таблицу, чтобы иметь доступ ко всем методам через один указатель на начало таблицы.Нет, абсолютно разные.
...
Рейтинг: 0 / 0
3 вопроса
    #33733250
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот набросал ради интереса :)
Код: plaintext
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.
#include <iostream>
#include <tchar.h>
#include <windows.h>

class c1 {
public:
	int i;
	c1() : i( 0 )	{}
	virtual ~c1() {}
};

class c2 {
public:
	int i;
	c2() : i( 0 )	{}
};

class c3 : public c1 {
public: 
	virtual ~c3(){}
};

class c4 : public c1 {
public: 
	virtual ~c4() {}
};

int _tmain(int argc, _TCHAR* argv[])
{
	c1 o1;	c2 o2;	c3 o3;	c4 o4;
	printf("sizeof(c1) = %d\nsizeof(c2) = %d\n\n", sizeof(o1), sizeof(o2));
	printf("VMT c1: %p\nVMT c2: %p\nVMT c3: %p\nVMT c4: %p\n", (void*)(*(int*)(&o1)), (void*)(*(int*)(&o2)), (void*)(*(int*)(&o3)), (void*)(*(int*)(&o4)));
	::Sleep( 5000 );
	return  0 ;
}
...
Рейтинг: 0 / 0
3 вопроса
    #33733488
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
class c1
{
public:
	int z1;
	virtual int func();
	virtual int func1();
};

int c1::func()
{ return  1 ; }

int c1::func1()
{ return  1 ; }

class c2
{
public:
	int z2;
	virtual int func();
	virtual int func2();
};

int c2::func()
{ return  2 ; }

int c2::func2()
{ return  2 ; }

class c3: public c1, public c2
{
public:
	int z3;
	virtual int func();
	virtual int func3();
};

int c3::func()
{ return  3 ; }

int c3::func3()
{ return  3 ; }

int _tmain(int argc, _TCHAR* argv[])
{
	c3 *obj; int i;
	obj = new c3();
	obj->z1= 1 ; obj->z2= 2 ; obj->z3= 3 ;
	_tprintf(_T("dump:\n"));
	for(i= 0 ;i<sizeof(*obj);i++)
	{
		_tprintf(_T(" %u\n"), *((int*)obj+i) );
	}
	return  0 ;
}
выдаёт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
dump:
 4350748
 1
 4350016
 2
 3
 4261281277
 524315
 3722248192
 3277392
 3277392
 3722304989
 3722304989
 3722304989
 3722304989
 3722304989
 3722304989
 3722304989
 3722304989
 3722304989
 3722304989
сам sizeof равен 20. Откуда 20-то?
...
Рейтинг: 0 / 0
3 вопроса
    #33733496
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, блин, ступил...
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
3 вопроса
    #33733521
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну дак здесь-же наследование множественное. Два указателя на VMT (8 байт) плюс 3 интежера (12 байт). 8 + 12 = 20 :).
...
Рейтинг: 0 / 0
3 вопроса
    #33733774
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вам вообщем пример.

Код: plaintext
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
hell@hells:/tmp/test$ cat  1 .cpp
#include <stdio.h>

class t
{
public: 
  int x;
  void setx(int i) {x=i;}
};

int main(void)
{
  t z;
  z.setx( 55 );
  printf("%d\n", z.x);
  return  0 ;
}


hell@hells:/tmp/test$ cat  1 .s 
	.file	"1.cpp"
	.section	.rodata.str1. 1 ,"aMS",@progbits, 1 
.LC0:
	.string	"%d\n"
	.text
	.align  2 
.globl main
	.type	main, @function
main:
.LFB3:
	pushl	%ebp
.LCFI0:
	movl	%esp, %ebp
.LCFI1:
	pushl	$ 55 
	pushl	$.LC0
.LCFI2:
	call	printf
	xorl	%eax, %eax
	leave
	ret
.LFE3:
	.size	main, .-main
	.section	.eh_frame,"a",@progbits
.Lframe1:
	.long	.LECIE1-.LSCIE1
.LSCIE1:
	.long	0x0
	.byte	0x1
	.string	"zP"
	.uleb128 0x1
	.sleb128 - 4 
	.byte	0x8
	.uleb128 0x5
	.byte	0x0
	.long	__gxx_personality_v0
	.byte	0xc
	.uleb128 0x4
	.uleb128 0x4
	.byte	0x88
	.uleb128 0x1
	.align  4 
.LECIE1:
.LSFDE1:
	.long	.LEFDE1-.LASFDE1
.LASFDE1:
	.long	.LASFDE1-.Lframe1
	.long	.LFB3
	.long	.LFE3-.LFB3
	.uleb128 0x0
	.byte	0x4
	.long	.LCFI0-.LFB3
	.byte	0xe
	.uleb128 0x8
	.byte	0x85
	.uleb128 0x2
	.byte	0x4
	.long	.LCFI1-.LCFI0
	.byte	0xd
	.uleb128 0x5
	.byte	0x4
	.long	.LCFI2-.LCFI1
	.byte	0x2e
	.uleb128 0x8
	.align  4 
.LEFDE1:
	.ident	"GCC: (GNU) 4.0.4 20060507 (prerelease) (Debian 4.0.3-3)"
	.section	.note.GNU-stack,"",@progbits
hell@hells:/tmp/test$


Всё как я обещал. Засунули в стек 55, потом указатель на строку формата и вызвали принтф)
__________________
For more information, please proceed to http://www.ot-e.biz
...
Рейтинг: 0 / 0
3 вопроса
    #33734099
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Балтика MasterZiv...
Понятия "размер метода класса" вообще не существует, у метода нет размера.Это конечно так, но наличие виртуальных на размер класса влияет.

Незначительно. Как и выравнивание.

Кстати , про выравнивание забыл написать. Некоторые компиляторы на некоторых системах для более быстрого доступа к классу и его элементам могут выравнивать поля и/или сам класс по границам слов, двойных слов или полуслов (это все зависит от системы) и таким образом размер объекта может вырости. Обычно все это может настраиваться на уровне опций компилатора, если конечно это возможно в принципе (в смысле делать и так, и так).
...
Рейтинг: 0 / 0
3 вопроса
    #33734101
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Homosum

Как??? Как наличие виртуальных методов может влиять на размер объекта класса?

Ну указатель на таблицу виртуальных методов добавляется в объект, а может даже и не один. Меняется, но незначительно.
...
Рейтинг: 0 / 0
3 вопроса
    #33734104
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoа если было наследование от нескольких классов с виртуальными методами, по-видимому, будет несколько указателей.

Именно так. Если хоть одна ветка наследования невиртуальная, естественно.
...
Рейтинг: 0 / 0
3 вопроса
    #33734141
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv Homosum

Как??? Как наличие виртуальных методов может влиять на размер объекта класса?

Ну указатель на таблицу виртуальных методов добавляется в объект, а может даже и не один. Меняется, но незначительно.


MasterZiv, Балтика, спасибо большое - буду знать!
...
Рейтинг: 0 / 0
21 сообщений из 46, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / 3 вопроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]