Че работает быстрее?
Кто может мне объяснить, чем может отличается (если вообще отличается) следующий код:
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;
/*реализация методов опущена*/
я знаю что во втором случае можно использовать такие удобные вещи как конструктор и деструктор, а в отношении быстродействия какие методы будут быстрее вызываться т что у структуры или у класса?
ЗЫ
Спасибо за внимание…
Теперь о стиле кода. Если ты заговорил о конструкторах, это значит, что пишешь ты на С++, а не на С. Тогда первое, замечание: НЕЗАЧЕМ ИСПОЛЬЗОВАТЬ С-ный стиль определения классов и структур, т.е. нет смысла писать typedef.
Второе, С++ - ООП язык программирования, поэтому методы оперирующие данными класса должны быть методами этого класса.
Третье, класс должен инкапсулировать свои данные, именно поэтому у тебя есть "гетеры и сетеры" (от Get, Set), а сл-но данные надо объявить, как закрытые.
Что же касается различий кла ссов и структур, то в принципе только в открытости по-умолчанию членов.
Далее субъективно.
Удобно давать имена классам с большой буквы без подчеркивания. Если в названии несколько слов, а в большинстве случаев это так, т.к. название должно ясно говорить о назначении класса, то каждое слово пишется с большой буквы. Не стоит сокращать слова, кроме общепринятых сокращений.
А вот названия методов лучше писать с маленькой буквы. Название так же должно отражать назначение метода, причем начинаться с глагола (в данном случае так оно и есть - get, set).
Ну и понятно, что данные класса должны тоже иметь значимые имена, а не просто a, b, c. Желательно показать в названии, что переменная является внутренностью класса, это делается по-разному в зависимости от стиля: кто-то пишет m_ (MFC, WTL), кто-то ставит вначале подчеркивание (что несколько противоречит стандарту, т.к. там предполагается, что подчеркивания вначале зарезервированы для внутренних нужд языка).
Поэтому правильным с точки зрения стиля будет:
{
private:
int m_iValue;
public:
int getValue();
void setValue(int value);
};
P.S. Подходите к написанию программ с точки зрения того, что исходный код пишется для людей, а не для машины. Делайте его как можно читабельнее.
Между классами и структурами разницы нет(почти).
Конструкторы и деструкторы могут содержать обе
конструкции. Потому конечно решать тебе, что и где использовать. Могу лишь заметить, что
было бы неплохо соблюдать первичное предназначение
структур, как данных, а позже и операций с данными
(типа +-*/[]), а классов как оболочки их инкапсулирующие.
Что касается внешних ф-ций и ф-ций членов, то
тут разница существенна и зависит от типа задачи решаемой ф-цией.
Если, к примеру, ф-ция обрабатывает большой объем данных структуры, то неплохо было бы
для увеличения скорости доступа (операция "->" одна из самых тормознутых) включить ф-цию в
структуру. Однако если данные носят уникальный характер, и требование к скорости критично, то
можно задать данные как глобальные (они работаю быстрее).
И все в таком же духе...;)
Могу лишь заметить, что
было бы неплохо соблюдать первичное предназначение
структур, как данных, а позже и операций с данными
(типа +-*/[]), а классов как оболочки их инкапсулирующие.
"Первичное предназначение" структур осталось в С.
В С++ их предназначение одинаковое, и структура осталась лишь для совместимости. Так что нет никакого "первичного предназначения" и сл-но нечего соблюдать.
Что касается внешних ф-ций и ф-ций членов, то
тут разница существенна и зависит от типа задачи решаемой ф-цией.
Все завист от того придерживаешься ли ты ООП или нет. В принципе при ООП должна быть всего одна глобальная функция - entry point.
Если, к примеру, ф-ция обрабатывает большой объем данных структуры, то неплохо было бы
для увеличения скорости доступа (операция "->" одна из самых тормознутых) включить ф-цию в
структуру.
1. Не вижу разницы в вызове функции и метода от объема данных.
2. Ты имел в виду операцию "->" или все же оператор "->".
3. И чем же эта операция тормознутая?
Однако если данные носят уникальный характер, и требование к скорости критично, то
можно задать данные как глобальные (они работаю быстрее).
Это ещё почему?
Ок, давай будем дотошными.
Есть класс A у него еcть метод method, есть глобальныя функция func оперирующая данными класса.
{
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. Перестаньте страдать ерундой. Это не та область, где нужно и можно выиграть в скорости.
"Первичное предназначение" структур осталось в С.
В С++ их предназначение одинаковое, и структура осталась лишь для совместимости. Так что нет никакого "первичного предназначения" и сл-но нечего соблюдать.
так же как и венгерскую нотацию...:)
1. Не вижу разницы в вызове функции и метода от объема данных.
Да ну?
{
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. Если человек пишет игру, то это резонный вопрос а не ерунда.
З.Ы.: "Если ты что-то знаешь, то это еще не
значит, что ты должен всюду этим пользоваться..."
(Некий программер)
так же как и венгерскую нотацию...
При чем тут венгерская нотация?
Какое отношение она имеет к языку?
Да ну?
{
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);
}
Все равно не вижу разницы. :)
Оператор разименования и доступа."*."
Смотри выше^
Ну и как ты обойдешь затраты по времени на оператор разыменования при использовании глобальных функций? :)
Для чего используется оператор разыменования, в курсе?
И где ты там такое нашел?
Какие глоб. ф-ции? Я говорил про глоб. данные.
Вспомним видео-карты...
Хорошо... и чем же глобальные данные отличаются в скорости доступа от членов класса?
P.S. Если человек пишет игру, то это резонный вопрос а не ерунда.
Неа... не резонный. Говорю, как человек связанный с геймдевом.
З.Ы.: "Если ты что-то знаешь, то это еще не
значит, что ты должен всюду этим пользоваться..."
(Некий программер)
Не смешивайте стили! (С)Я
Все проблемы с лишним временем и многими багами из-за смешивания стилей.
При чем тут венгерская нотация?
Какое отношение она имеет к языку?
Это о том, что есть структура и что такое удобство.
Все равно не вижу разницы. :)
Ну и как ты обойдешь затраты по времени на оператор разыменования при использовании глобальных функций? :)
Для чего используется оператор разыменования, в курсе?
В курсе:}
Хорошо... и чем же глобальные данные отличаются в скорости доступа от членов класса?
У тебя просто талант все перекаверкивать:
я имел в виду, то что вместо передачи параметров
в критичных местах их их можно юзать из глобалки.
void BlaBlaBla(cclassex *pclsx)
{
.....
}
void BlaBlaBlaFast()
{
.....
}
Неа... не резонный. Говорю, как человек связанный с геймдевом.
Это уже интересно:). Подробней можно. please...
"Чего не вижу, того - нет":devil:
У тебя просто талант все перекаверкивать:
я имел в виду, то что вместо передачи параметров
в критичных местах их их можно юзать из глобалки.
void BlaBlaBla(cclassex *pclsx)
{
.....
}
void BlaBlaBlaFast()
{
.....
}
По моему проще и удобнее использовать методы... ;)
Это уже интересно:). Подробней можно. please...
По моему проще и удобнее использовать методы... ;)
И по моему:D,но тема не та...
Круууто8)