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

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

Войти
Регистрация
Восстановить пароль
 
Bers
Заблокирован
#1

Вопрос к знатокам (ООП + ассемблер) - C++

11.11.2011, 20:57. Просмотров 904. Ответов 6
Метки нет (Все метки)

Ниже представлены три тестовых класса.

Первый - классическая модель классов в с++
Имеет методы, и данные члены. Обрабатывает свои данные члены "напрямую"

Второй - практически как первый, только данные члены агрегируются через дополнительную прокладку- структуру. Доступ к данным осуществляется через модификатор доступа объекта.

Третий - причина, по которой была создана эта тема. Манипулятор. Не имеет собственных данных членов, но работает с объектом через указатель на него.


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
struct SData { int m_a, m_b; };
 
class CTest:private SData
{
public: void Do() 
        { 
            std::cout<< "Test!\n"; 
            std::cout<< m_a<<" "<<m_b<< "\n"; 
        }
};
 
class CTest1
{
public: void Do() 
        { 
            std::cout<< "Test1!\n"; 
            std::cout<< m_data.m_a<<" "<<m_data.m_b<< "\n"; 
        }
protected: SData m_data;
};
 
 
class CTest2
{
public: void Do(const SData* pTarget) const
        { 
            std::cout<< "Test2!\n"; 
            std::cout<< pTarget->m_a<<" "<<pTarget->m_b<< "\n"; 
        }
};
 
 
int main()
{
    CTest test;   test.Do();
    CTest1 test1; test1.Do();
    CTest2 test2; test2.Do( &(SData()) );
 
    return 0;
}
Если кратко: какой из трех классов будит работать быстрее?

Если раскрыть вопрос: Есть ли вообще хоть какая то разница по скорости доступа к данными между третьим и втором классом?
Я не знаю ассемблера, но у меня возникло подозрение, что доступ к данным через "точечку" и через "стрелочку" с одинаковый скоростью. Не?

И есть ли разница по скорости доступа к данным между первым, и двумя последними классами?

Ведь все равно, на самом деле класс после компиляции - суть набор функций-обработчиков данных объекта. Объект живёт отдельно от этих функций.

Логично предположить, что в любом случае доступ к объекту будит осуществлен по некому указателю, в том или ином виде. Поэтому, во всех трех случаях скорость доступа к данным будит одинаковая. Я прав? А если нет, расскажите пожалуйста, какой класс будит работать быстрее.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2011, 20:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос к знатокам (ООП + ассемблер) (C++):

Вопрос по ООП - C++
Стоит ли реализовывать программу через классы, если в главной ф-ции предполагается создание только одного объекта? Вобщем решил...

ООП ВОПРОС - C++
Плиз обьясните почему нельзя сделать так (ошибка): #include&lt;iostream&gt; using namespace std; class one { public: int a; } ...

Вопрос по ООП - C++
Вот код class time { private: int hours; int minutes; public: int sum_time(time object, days day); ...

вопрос по ооп - C++
вот фаил с описанием класса. что такое #ifndef _STOCK1_H_ #define _STOCK1_H_ и #endif в 1,2 и последних строках соответсвенно. ...

ООП - вопрос про деструктор - C++
#include &lt;iostream&gt; class oop { int a; char * name; public: oop(char *,int); ~oop(); void show();

К знатокам С++: это самодостаточный язык, или всё таки он зависит от Си - C++
Объясните мне пожалуйста, ибо я не догоняю... Я изучаю С++, языка Си я не знаю. Читать родоночальника языка слишком для меня хардова,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Van111
кодер с++
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
11.11.2011, 21:02 #2
Цитата Сообщение от Bers Посмотреть сообщение
"точечку" и через "стрелочку" с одинаковый скоростью. Не?
страус труп писал что через точку вроде быстрее так как объект в стеке а не dump -е
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 21:05 #3
Van111, под дампом вы имели ввиду кучу (heap)? Указатель бывает и на стековый объект.
Bers, присоединяюсь к вопросу.
0
Bers
Заблокирован
11.11.2011, 21:08  [ТС] #4
Цитата Сообщение от Van111 Посмотреть сообщение
страус труп писал что через точку вроде быстрее так как объект в стеке а не dump -е
C++
1
2
3
4
void Do( const SomeClass& data)
{
     data.View(); 
}
Здесь: доступ к данным через точечку, хотя на самом деле он осуществляется через ссылку. А ссылка - это указатель. Скорость доступа к данным через ссылку, и через указатель - одинаковые (если я ничего не путаю).

Ну так вот, обычное имя переменной на уровне ассемблера - это тоже указатель. Имя переменой на самом деле хранит адрес объекта.
0
Van111
кодер с++
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
11.11.2011, 21:49 #5
Цитата Сообщение от talis Посмотреть сообщение
Van111, под дампом вы имели ввиду кучу (heap)?
да
а вот кстати насчёт точки и -> .MVS размещает объеты в стеке а Borland в куче но я так и не понял у кого эффективней и быстрее работает!?

Добавлено через 5 минут
Цитата Сообщение от Bers Посмотреть сообщение
Ну так вот, обычное имя переменной на уровне ассемблера - это тоже указатель. Имя переменой на самом деле хранит адрес объекта.
да и ещё на ассемблере для взятия значения по указателю используются скобки то есть
mov eax,ADDR x грузит в регистр адрес
lea eax,x грузит в регистр адрес
mov eax,offset x грузит в регистр адрес

mov eax,x грузит в регистр значение
вроде так

Добавлено через 3 минуты
точно синтаксис выделения памяти не помню
struct SData { int m_a, m_b; };
SData:
m_a dw
m_b dw
1
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.11.2011, 22:05 #6
Цитата Сообщение от Van111 Посмотреть сообщение
а вот кстати насчёт точки и -> .MVS размещает объеты в стеке а Borland в куче но я так и не понял у кого эффективней и быстрее работает!?
Вы прежде чем постить ответы в разделе C++, хотя бы поверхностно ознакомтесь с этим языком. Где размещаются объекты от IDE никак не зависит.
Цитата Сообщение от Van111 Посмотреть сообщение
вроде так
Цитата Сообщение от Van111 Посмотреть сообщение
точно синтаксис выделения памяти не помню
Если "вроде так" и "не помню", то к чему вообще писать? Зачем отвечать в теме, в которой Вы не компетентны?

Цитата Сообщение от Bers Посмотреть сообщение
Логично предположить, что в любом случае доступ к объекту будит осуществлен по некому указателю, в том или ином виде. Поэтому, во всех трех случаях скорость доступа к данным будит одинаковая. Я прав?
В общем, различия нребольшие есть (например в втором случае Do имеет два аргумента, а в других один), но они несущественны.
2
Bers
Заблокирован
11.11.2011, 22:30  [ТС] #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
В общем, различия нребольшие есть (например в втором случае Do имеет два аргумента, а в других один), но они несущественны.
Интересует скорость доступа к объекту

Добавлено через 23 минуты
Если чисто логически рассуждать:

C++
1
2
3
4
5
6
7
struct SData { int m_a, m_b; };
 
class CTest:private SData
{
public:
 void Do()  {  std::cout<< "Test!\n";  std::cout<< m_a<<" "<<m_b<< "\n";    }
};
-Обращение к this объекта,
-Обращение к данным-членам this
Итого: Два уровня адресации.

C++
1
2
3
4
5
class CTest1
{
public: void Do()   { std::cout<< m_data.m_a<<" "<<m_data.m_b<< "\n";  }
protected: SData m_data;
};
-Обращение к this объекта
-Обращение к данному-члену m_data
-Обращение к данным
Итого: 3 уровня адресации.

C++
1
2
3
4
5
class CTest2
{
public: void Do(const SData* pTarget) const
        {  std::cout<< pTarget->m_a<<" "<<pTarget->m_b<< "\n";   }
};
- Обращение к this объекта
- Обращение к указателю
- Обращение к данным

Итого: 3 уровня адресации

C++
1
2
3
4
5
6
7
8
9
10
11
class CTest3
{ 
     SData* myTarget
public: 
      CTest3(const SData* pTarget): myTarget(pTarget){}
 
        void Do()
        { 
               std::cout<< myTarget->m_a<<" "<<myTarget->m_b<< "\n"; 
        }
};
- обращение к this
- обращение к указателю
- обращение к данным

итого 3 уровня адресации.


Предположение: Самый первый вариант - самый быстрый. 2 уровня адресации.
Остальные - однозначные
3
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2011, 22:30
Привет! Вот еще темы с ответами:

Простой вопрос к знатокам С++ и VB ? - Visual Basic
pEvent-&gt;SetNotifyWindow((OAHWND)g_hwnd, WM_GRAPHNOTIFY, 0); равно Call pEvent.SetNotifyWindow(Me.hWnd,WM_GRAPHNOTIFY, 0) ...

Вопрос знатокам SQL - Базы данных
В базе есть инфа вида: Доход, Месяц. Но не в каждом месяце есть доход. Тогда по этому месяцу просто нет записи. А в другом месяце их...

Вопрос знатокам вебсервисов - Java
Вот работаю с JWSDP (для тех кто не в курсе это такая бесплатная поделка от SUN на тему вебсервисов). Версия 1.3. Ну вот сделал я вебсервис...

Вопрос к знатокам SQL - MS Access
Есть таблица - test name id a 1 b 2 c 3 a 0 a 0 b 0 b 0 c 0


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.11.2011, 22:30
Ответ Создать тему
Опции темы

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