USBLexus
							
								Опытный 
								
								 
								  Offline
								Пол:   
								
								Кот рыжий
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 «  : 06-06-2005 07:27 »   | 
								
								 | 
							  
							 
							Может быть вопрос немного ламерский, но хотелось бы окончательно развеять свои сомнения
  Есть несколько объектов например 5 В каждом объекте есть член класс например m_MemberClass У этого m_MemberClass все функции описаны как Static Значит ли это что для всех объектов будет физичечки выделена память только для одного экземпляра функций m_MemberClass или же для каждого объекта будет свой вариант статических функций m_MemberClass? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Alf
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 06-06-2005 07:35 »   | 
								
								 | 
							  
							 
							Независимо от того, является ли функция статической или нет, в экземпляре класса для нее память отводиться не будет. Экземпляр хранит лишь переменные состояния, все функции данного класса хранятся отдельно.
  Отличие статических функций лишь в том, что их можно вызывать, не создавая экземпляр класса. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							USBLexus
							
								Опытный 
								
								 
								  Offline
								Пол:   
								
								Кот рыжий
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									«  Ответ #2 : 06-06-2005 07:45 »    | 
								
								 | 
							  
							 
							Независимо от того, является ли функция статической или нет, в экземпляре класса для нее память отводиться не будет. Экземпляр хранит лишь переменные состояния, все функции данного класса хранятся отдельно.
  Отличие статических функций лишь в том, что их можно вызывать, не создавая экземпляр класса.
  Т.е. когда я создаю экземпляр класса например new CEdit  под функции память не выделяется? А где они тогда хранятся?  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Alf
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #3 : 06-06-2005 07:55 »   | 
								
								 | 
							  
							 
							Они хранятся там же, где и остальной код программы. Иначе возникли бы проблемы.
  Во-первых, это накладно. Представь себе, что ты написал класс CComplex  для работы с комплексными числами. Он включает в себя два числа - действительную и мнимую части - и кучу функций и операторов для работы с ними. Если тебе нужен массив из многих тысяч таких чисел, пришлось бы держать в памяти огромное количество копий этих функций. А во главу угла при разработке языка Страуструп ставил сохранение эффективности С, т.е дополнительные возможности С++ не должны тащить за собой ощутимых накладных расходов.
  Во-вторых, это просто не нужно, поскольку код для всех экземпляров один и тот же. Хранить множество копий одних и тех же функций нерационально, да еще и чревато ошибками (а что, если одна из них будет отличаться от других?).
  Можешь попробовать проверить это на практике. Посмотри, что вернет функция sizeof  для объекта с большим количеством функций. Или создай его на куче и погляди в отладчике, что творится в памяти на самом деле. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							USBLexus
							
								Опытный 
								
								 
								  Offline
								Пол:   
								
								Кот рыжий
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #4 : 06-06-2005 08:02 »   | 
								
								 | 
							  
							 
							Альф
  Т.е. как я понял можно смело создавать сколь угодно много объектов и члены функции их члена m_Member ничего не будут весить? Ну чтож надеюсь это действительно так иначе у меня будут проблемы с памятью 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Alf
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #5 : 06-06-2005 08:14 »   | 
								
								 | 
							  
							 
							Совершенно правильно понял. Все члены-функции будут храниться в единственном экземпляре, без разницы, статические они или нет. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							USBLexus
							
								Опытный 
								
								 
								  Offline
								Пол:   
								
								Кот рыжий
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #6 : 06-06-2005 08:32 »   | 
								
								 | 
							  
							 
							Совершенно правильно понял. Все члены-функции будут храниться в единственном экземпляре, без разницы, статические они или нет.
  А где про это можно почитать У Страустрапа я чтото ничего не могу по этому поводу найти  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Alf
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #7 : 06-06-2005 08:43 »   | 
								
								 | 
							  
							 
							Вечером дома погляжу, на работе Старуструпа нет. Хотя не уверен,что он про такие низкоуровневые вещи пишет. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							USBLexus
							
								Опытный 
								
								 
								  Offline
								Пол:   
								
								Кот рыжий
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #8 : 08-06-2005 02:00 »   | 
								
								 | 
							  
							 
							Альф
  Ну что там? Не нашел? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Alf
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #9 : 08-06-2005 06:15 »   | 
								
								 | 
							  
							 
							Пока нет... Придется тебе пока поверить на слово. Ну или пройтись отладчиком и убедиться лично. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Anchorite
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #10 : 12-06-2005 18:53 »   | 
								
								 | 
							  
							 
							USBLexus скажи пожалуйста, как ты представляешь себе выделение памяти под методы конкретного объекта? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							USBLexus
							
								Опытный 
								
								 
								  Offline
								Пол:   
								
								Кот рыжий
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #11 : 14-06-2005 01:44 »   | 
								
								 | 
							  
							 
							USBLexus скажи пожалуйста, как ты представляешь себе выделение памяти под методы конкретного объекта?
  В смысле? А как ты представляешь себе выделение памяти под конкретную программу? Вот точно также я себе представлял выделение памяти под экземпляр класса  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Anchorite
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #12 : 14-06-2005 17:26 »   | 
								
								 | 
							  
							 
							Т.е. ты представляешь это таким образом: 1. Распеределяем блоки памяти под данные объекта и под его код. 2. Инициализируем данные и код. Все-бы это имело смысл, если бы КАЖДЫЙ объект существовал в своем СОБСТВЕННОМ адресном пространстве. В нашем случае этого нет, т.к. все объекты "живут" в одном адресном пространстве (создаются внутри одного процесса). Поэтому проще и быстрее распределять только данные, а код методов иметь в единственном экземпляре. А при вызове метода объекта просто передать ему еще один параметр (положение данных в памяти) и при доступе к данным класса использовать именно его. Кстати подумай на досуге для чего в С++ есть указатель this и кто и когда его инициализирует.    
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							USBLexus
							
								Опытный 
								
								 
								  Offline
								Пол:   
								
								Кот рыжий
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #13 : 15-06-2005 01:57 »   | 
								
								 | 
							  
							 
							про выделение памяти для методов я уже вообще то разобрался с Альфовой помощью Лучше дай ссылку на первоисточники, сам хочу про это почитать 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Anchorite
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #14 : 15-06-2005 16:26 »   | 
								
								 | 
							  
							 
							Первоисточником всего этого для меня является мой личный опыт работы с дизассемблерами и отладчиками, 
  Альф правильно сказал - или верь на слово или напиши простую прогу с использованием объектов в различных вариантах (Статическом, автоматическом и динамическими. С виртуальными методами и без них), а потом дизассемблируй ее при помощи IDA и посмотри как там что и к чему.
  От себя добавлю, что если используешь MSVS, то обрати внимание на инициализацию регистра ECX перед передачей управленния на метод класса.
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							LP
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #15 : 23-06-2005 14:35 »   | 
								
								 | 
							  
							 
							А где про это можно почитать У Страустрапа я чтото ничего не могу по этому поводу найти
  Про это можно почитать в книге "Inside the C++ object model" by Stan Lippman...  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Если эта надпись уменьшается, значит ваш монитор уносят 
						 | 
					 
				 
			 |  
		 
	 | 
	 |