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

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

Восстановить пароль Регистрация
 
Bers
Заблокирован
11.11.2011, 20:57     Вопрос к знатокам (ООП + ассемблер) #1
Ниже представлены три тестовых класса.

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

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

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


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;
}
Если кратко: какой из трех классов будит работать быстрее?

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

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

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

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

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

Ну так вот, обычное имя переменной на уровне ассемблера - это тоже указатель. Имя переменой на самом деле хранит адрес объекта.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 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
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.11.2011, 22:05     Вопрос к знатокам (ООП + ассемблер) #6
Цитата Сообщение от Van111 Посмотреть сообщение
а вот кстати насчёт точки и -> .MVS размещает объеты в стеке а Borland в куче но я так и не понял у кого эффективней и быстрее работает!?
Вы прежде чем постить ответы в разделе C++, хотя бы поверхностно ознакомтесь с этим языком. Где размещаются объекты от IDE никак не зависит.
Цитата Сообщение от Van111 Посмотреть сообщение
вроде так
Цитата Сообщение от Van111 Посмотреть сообщение
точно синтаксис выделения памяти не помню
Если "вроде так" и "не помню", то к чему вообще писать? Зачем отвечать в теме, в которой Вы не компетентны?

Цитата Сообщение от Bers Посмотреть сообщение
Логично предположить, что в любом случае доступ к объекту будит осуществлен по некому указателю, в том или ином виде. Поэтому, во всех трех случаях скорость доступа к данным будит одинаковая. Я прав?
В общем, различия нребольшие есть (например в втором случае Do имеет два аргумента, а в других один), но они несущественны.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2011, 22:30     Вопрос к знатокам (ООП + ассемблер)
Еще ссылки по теме:

c++ и ассемблер C++
К знатокам С++: это самодостаточный язык, или всё таки он зависит от Си C++
C++ Си VS Ассемблер

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

Или воспользуйтесь поиском по форуму:
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 уровня адресации.
Остальные - однозначные
Yandex
Объявления
11.11.2011, 22:30     Вопрос к знатокам (ООП + ассемблер)
Ответ Создать тему
Опции темы

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