Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Че работает быстрее?

1.9K
03 августа 2005 года
HEvgA
49 / / 16.09.2004
Здравствуйте уважаемые.

Кто может мне объяснить, чем может отличается (если вообще отличается) следующий код:

typedef struct struct_t_ {
int a;
int GetA();
void SetA( int new_val);
} struct_t;
int struct_t_::GetA( ){ return a;};
void struct_t_::SetA( int new_val ){ a = new_val;};

от этого

typedef struct struct_t_ {
int a;
} struct_t;
int GetA( struct_t* s ){ return s->a;};
void SetA(struct_t* s, int new_val ){ s->a = new_val;};

Я вижу что они отличаются передаваемыми параметрами, во втором случае добавился параметр struct_t* s. Меня больше интересует быстродействие. Для удобства удобнее конечно же первый вариант, и более логичнее и среда при вводе например qwe->, сразу же указывает в выпадающем списке, какие методы есть у этой структуры. А в отношении быстродействия, чё будет быстрее.
И еще, чем отличается:

typedef struct struct_t_ {
int a;
int GetA();
void SetA( int new_val);
} struct_t;
/*реализация методов опущена*/
от
typedef class struct_t_ {
int a;
int GetA();
void SetA( int new_val);
} struct_t;
/*реализация методов опущена*/

я знаю что во втором случае можно использовать такие удобные вещи как конструктор и деструктор, а в отношении быстродействия какие методы будут быстрее вызываться т что у структуры или у класса?

ЗЫ
Спасибо за внимание…
3
04 августа 2005 года
Green
4.8K / / 20.01.2000
Ответ на вопрос о быстродействии: все зависит от компилятора, но в общем случае ОТЛИЧИЙ В СКОРОСТИ НЕТ. Твой вопрос из разряда "На сколько измянятся параметры орбиты Земли, если я подпрыгну?".

Теперь о стиле кода. Если ты заговорил о конструкторах, это значит, что пишешь ты на С++, а не на С. Тогда первое, замечание: НЕЗАЧЕМ ИСПОЛЬЗОВАТЬ С-ный стиль определения классов и структур, т.е. нет смысла писать typedef.
Второе, С++ - ООП язык программирования, поэтому методы оперирующие данными класса должны быть методами этого класса.
Третье, класс должен инкапсулировать свои данные, именно поэтому у тебя есть "гетеры и сетеры" (от Get, Set), а сл-но данные надо объявить, как закрытые.
Что же касается различий кла ссов и структур, то в принципе только в открытости по-умолчанию членов.

Далее субъективно.
Удобно давать имена классам с большой буквы без подчеркивания. Если в названии несколько слов, а в большинстве случаев это так, т.к. название должно ясно говорить о назначении класса, то каждое слово пишется с большой буквы. Не стоит сокращать слова, кроме общепринятых сокращений.
А вот названия методов лучше писать с маленькой буквы. Название так же должно отражать назначение метода, причем начинаться с глагола (в данном случае так оно и есть - get, set).
Ну и понятно, что данные класса должны тоже иметь значимые имена, а не просто a, b, c. Желательно показать в названии, что переменная является внутренностью класса, это делается по-разному в зависимости от стиля: кто-то пишет m_ (MFC, WTL), кто-то ставит вначале подчеркивание (что несколько противоречит стандарту, т.к. там предполагается, что подчеркивания вначале зарезервированы для внутренних нужд языка).

Поэтому правильным с точки зрения стиля будет:
 
Код:
class PrimitiveHolder
{
private:
  int m_iValue;

public:
  int  getValue();
  void setValue(int value);
};


P.S. Подходите к написанию программ с точки зрения того, что исходный код пишется для людей, а не для машины. Делайте его как можно читабельнее.
2.0K
04 августа 2005 года
WidowMaker
212 / / 05.04.2005
Различия в скорости конечно есть, но не большие.
Между классами и структурами разницы нет(почти).
Конструкторы и деструкторы могут содержать обе
конструкции. Потому конечно решать тебе, что и где использовать. Могу лишь заметить, что
было бы неплохо соблюдать первичное предназначение
структур, как данных, а позже и операций с данными
(типа +-*/[]), а классов как оболочки их инкапсулирующие.

Что касается внешних ф-ций и ф-ций членов, то
тут разница существенна и зависит от типа задачи решаемой ф-цией.
Если, к примеру, ф-ция обрабатывает большой объем данных структуры, то неплохо было бы
для увеличения скорости доступа (операция "->" одна из самых тормознутых) включить ф-цию в
структуру. Однако если данные носят уникальный характер, и требование к скорости критично, то
можно задать данные как глобальные (они работаю быстрее).

И все в таком же духе...;)
3
05 августа 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by WidowMaker
Могу лишь заметить, что
было бы неплохо соблюдать первичное предназначение
структур, как данных, а позже и операций с данными
(типа +-*/[]), а классов как оболочки их инкапсулирующие.


"Первичное предназначение" структур осталось в С.
В С++ их предназначение одинаковое, и структура осталась лишь для совместимости. Так что нет никакого "первичного предназначения" и сл-но нечего соблюдать.

Цитата:
Originally posted by WidowMaker
Что касается внешних ф-ций и ф-ций членов, то
тут разница существенна и зависит от типа задачи решаемой ф-цией.


Все завист от того придерживаешься ли ты ООП или нет. В принципе при ООП должна быть всего одна глобальная функция - entry point.

Цитата:
Originally posted by WidowMaker

Если, к примеру, ф-ция обрабатывает большой объем данных структуры, то неплохо было бы
для увеличения скорости доступа (операция "->" одна из самых тормознутых) включить ф-цию в
структуру.


1. Не вижу разницы в вызове функции и метода от объема данных.
2. Ты имел в виду операцию "->" или все же оператор "->".
3. И чем же эта операция тормознутая?

Цитата:
Originally posted by WidowMaker

Однако если данные носят уникальный характер, и требование к скорости критично, то
можно задать данные как глобальные (они работаю быстрее).


Это ещё почему?
Ок, давай будем дотошными.
Есть класс A у него еcть метод method, есть глобальныя функция func оперирующая данными класса.

Код:
struct A
{
    void method() {}
};

void func(A* pA) {}

int main()
{
    A* pA = new A;

    pA->method();
// 00411CC7  mov         ecx,dword ptr [pA]
// 00411CCA  call        A::method (411500h)

    func(pA);
// 00411CCF  mov         eax,dword ptr [pA]
// 00411CD2  push        eax  
// 00411CD3  call        func (41150Ah)
}

Ну и где глобальные функции работают быстрее?
Ну и где операция разыменования указателя ("->") тормознутая?

P.S. Перестаньте страдать ерундой. Это не та область, где нужно и можно выиграть в скорости.
2.0K
05 августа 2005 года
WidowMaker
212 / / 05.04.2005
По порядку:
Цитата:
Originally posted by Green
"Первичное предназначение" структур осталось в С.
В С++ их предназначение одинаковое, и структура осталась лишь для совместимости. Так что нет никакого "первичного предназначения" и сл-но нечего соблюдать.


так же как и венгерскую нотацию...:)

Цитата:

1. Не вижу разницы в вызове функции и метода от объема данных.


Да ну?

 
Код:
void CCall::Peace()
{
   for(int i=0;i<=0;i++) mark.array++;
   strcpy(mask,mem);
}
void Peace(CCall *source)
{
   for(int i=0;i<=0;i++) source->mark.array++;
   strcpy(source->mask,source->mem);
}

Цитата:

2. Ты имел в виду операцию "->" или все же оператор "->".


Оператор разименования и доступа."*."

Цитата:

3. И чем же эта операция тормознутая?


Смотри выше^

Цитата:

Это ещё почему?
Ок, давай будем дотошными.
Есть класс A у него еcть метод method, есть глобальныя функция func оперирующая данными класса.


И где ты там такое нашел?
Какие глоб. ф-ции? Я говорил про глоб. данные.
Вспомним видео-карты...

P.S. Если человек пишет игру, то это резонный вопрос а не ерунда.
З.Ы.: "Если ты что-то знаешь, то это еще не
значит, что ты должен всюду этим пользоваться..."
(Некий программер)

3
05 августа 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by WidowMaker

так же как и венгерскую нотацию...


При чем тут венгерская нотация?
Какое отношение она имеет к языку?

Цитата:
Originally posted by WidowMaker

Да ну?
 
Код:
void CCall::Peace()
{
   for(int i=0;i<=0;i++) mark.array++;
   strcpy(mask,mem);
}
void Peace(CCall *source)
{
   for(int i=0;i<=0;i++) source->mark.array++;
   strcpy(source->mask,source->mem);
}


Все равно не вижу разницы. :)

Цитата:
Originally posted by WidowMaker

Оператор разименования и доступа."*."
Смотри выше^


Ну и как ты обойдешь затраты по времени на оператор разыменования при использовании глобальных функций? :)
Для чего используется оператор разыменования, в курсе?

Цитата:
Originally posted by WidowMaker

И где ты там такое нашел?
Какие глоб. ф-ции? Я говорил про глоб. данные.
Вспомним видео-карты...


Хорошо... и чем же глобальные данные отличаются в скорости доступа от членов класса?

Цитата:
Originally posted by WidowMaker

P.S. Если человек пишет игру, то это резонный вопрос а не ерунда.


Неа... не резонный. Говорю, как человек связанный с геймдевом.

Цитата:
Originally posted by WidowMaker

З.Ы.: "Если ты что-то знаешь, то это еще не
значит, что ты должен всюду этим пользоваться..."
(Некий программер)


Не смешивайте стили! (С)Я
Все проблемы с лишним временем и многими багами из-за смешивания стилей.

2.0K
05 августа 2005 года
WidowMaker
212 / / 05.04.2005
Цитата:
Originally posted by Green
При чем тут венгерская нотация?
Какое отношение она имеет к языку?


Это о том, что есть структура и что такое удобство.

Цитата:

Все равно не вижу разницы. :)

Ну и как ты обойдешь затраты по времени на оператор разыменования при использовании глобальных функций? :)
Для чего используется оператор разыменования, в курсе?


В курсе:}

Цитата:

Хорошо... и чем же глобальные данные отличаются в скорости доступа от членов класса?


У тебя просто талант все перекаверкивать:
я имел в виду, то что вместо передачи параметров
в критичных местах их их можно юзать из глобалки.
void BlaBlaBla(cclassex *pclsx)
{
.....
}
void BlaBlaBlaFast()
{
.....
}

Цитата:

Неа... не резонный. Говорю, как человек связанный с геймдевом.


Это уже интересно:). Подробней можно. please...

"Чего не вижу, того - нет":devil:

3
05 августа 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by WidowMaker

У тебя просто талант все перекаверкивать:
я имел в виду, то что вместо передачи параметров
в критичных местах их их можно юзать из глобалки.
void BlaBlaBla(cclassex *pclsx)
{
.....
}
void BlaBlaBlaFast()
{
.....
}


По моему проще и удобнее использовать методы... ;)

Цитата:
Originally posted by WidowMaker

Это уже интересно:). Подробней можно. please...


creatstudio.ru
creatstudio.com

2.0K
06 августа 2005 года
WidowMaker
212 / / 05.04.2005
Цитата:
Originally posted by Green
По моему проще и удобнее использовать методы... ;)


И по моему:D,но тема не та...


Круууто8)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог