LINUX.ORG.RU

[c++] Префиксы у классов, переменных и т.п.

 


0

0

Иногда вижу префиксы m у перменных (mSomeVar) и I (большая i) у классов (ISomeClass). Насколько я понимаю, второе говорит о том, что класс является интерфейсом. А что есть m?

Какие ещё бывают префиксы?

Если у меня проект графического редактора на Qt, у которого есть поле, область инструментов, линейки масштаба, палитра и т.п., следует ли давать всем этим виджетам какой-то префикс?

Спасибо.

★★★★★
Ответ на: комментарий от Obey-Kun

> SomeFunct(const double& x) или SomeFunct(double x)?

если x не будет кастоваться и меняться - разницы никакой нет, компилятор сгенерирует один и тот же код

SomeFunct2( const MyStruct& x) или SomeFunct2(MyStruct x), где MyStruct содержит три дабла.


первое

Когда стоит переходить с передачи значения на использование ссылки?


для неатомарных типов и тех, которые заведомо компилятор не сможет к таковым привести при оптимизации( например для структуры из двух char вполне вероятно, что разницы не будет )

lester ★★★★
()
Ответ на: комментарий от lester

То же касается SomeFunct(const int& x) и SomeFunct(int x)? Спасибо, что добавил const'ы, надо отучить себя от вредной привычки.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

> То же касается SomeFunct(const int& x) и SomeFunct(int x)?

да

lester ★★★★
()
Ответ на: комментарий от lester

Ну, ок. Как скажешь.

#include <stdio.h>
#include <limits.h>
#include <time.h>

void f1(double &arg)
{
	arg+=1.0;
	return;
}

void f2(double arg)
{
	arg+=1.0;
	return;
}

int main(int argc, char **argv)
{
	 clock_t t1, t2;
	 double cpu_time_used;
	 long i, counts;
	 double d = 0.0;
	 counts = UINT_MAX >> 3;
	 printf("%d\n",counts);
	 
	 
	t1 = clock();
	for (i = counts; i !=0; f1(d))
		i--;
	t2 = clock();
	cpu_time_used = ((double) (t2 - t1)) / CLOCKS_PER_SEC;
	printf("Used time:%f\n", cpu_time_used);

	t1 = clock();
	for (i = counts; i !=0; f2(d))
		i--;
	t2 = clock();
	cpu_time_used = ((double) (t2 - t1)) / CLOCKS_PER_SEC;
	printf("Used time:%f\n", cpu_time_used);
	return 0;
}

Результат завидно постоянен:

Used time:1.953000
Used time:2.000000
LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

ты специально притворяешься идиотом? речь шла про r/o параметры, то что St_MPA3b забывал ставить const - это просто его невнимательность

lester ★★★★
()
Ответ на: комментарий от LamerOk

#include <stdio.h>
#include <limits.h>
#include <time.h>

фу

return 0;

фу

obey@damnbook test % g++ ./comp.cpp 
obey@damnbook test % ./a.out 
536870911
Used time:3.090000
Used time:3.230000
obey@damnbook test % ./a.out
536870911
Used time:3.110000
Used time:3.240000
obey@damnbook test % ./a.out
536870911
Used time:3.450000
Used time:3.230000
obey@damnbook test % ./a.out
536870911
Used time:3.540000
Used time:3.350000
obey@damnbook test % ./a.out
536870911
Used time:3.450000
Used time:3.240000
obey@damnbook test % ./a.out
536870911
Used time:3.440000
Used time:3.220000

В пределах погрешности, не?

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun
obey@damnbook test % g++ -O3 ./comp.cpp
obey@damnbook test % ./a.out           
536870911
Used time:0.000000
Used time:0.000000
obey@damnbook test % g++ -O2 ./comp.cpp
obey@damnbook test % ./a.out           
536870911
Used time:0.000000
Used time:0.000000
obey@damnbook test % g++ -O1 ./comp.cpp
obey@damnbook test % ./a.out           
536870911
Used time:3.180000
Used time:0.000000

:)

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от lester

А я думал, это ты притворяешься идиотом. Речь идет о замере скорости укладки/изьятия из стека double и double&, если ты вдруг до сих пор этого не понял.

#include <stdio.h>
#include <limits.h>
#include <time.h>

void f1(const double &arg)
{
	double d = 0.0;
	d = arg + 1.0;
	return;
}

void f2(const double arg)
{
	double d = 0.0;
	d = arg + 1.0;
	return;
}

int main(int argc, char **argv)
{
	 clock_t t1, t2;
	 double cpu_time_used;
	 long i, counts;
	 double d = 0.0;
	 counts = UINT_MAX >> 3;
	 printf("%d\n",counts);
	 
	 
	t1 = clock();
	for (i = counts; i !=0; f1(d))
		i--;
	t2 = clock();
	cpu_time_used = ((double) (t2 - t1)) / CLOCKS_PER_SEC;
	printf("Used time:%f\n", cpu_time_used);

	t1 = clock();
	for (i = counts; i !=0; f2(d))
		i--;
	t2 = clock();
	cpu_time_used = ((double) (t2 - t1)) / CLOCKS_PER_SEC;
	printf("Used time:%f\n", cpu_time_used);


	return 0;
}

Used time:1.984000
Used time:2.078000
LamerOk ★★★★★
()
Ответ на: комментарий от Obey-Kun

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

lester ★★★★
()
Ответ на: комментарий от LamerOk

> если ты вдруг до сих пор этого не понял.

доо - это ж я привел левый пример ;) а теперь включи оптимизацию и проверь еще раз

lester ★★★★
()
Ответ на: комментарий от Obey-Kun

> При чем здесь это? Имеет, допустим, виджет QFrostDrawArea и QFrostRectangle. И ещё кучу подобного. Как говорит товарищ, вместо такой гадости лучше использовать что-то вроде qfrost::DrawArea и qfrost::Rectangle.

А почему тогда не Q::Frost::DrawArea? где останавливаться предлагается?

gods-little-toy ★★★
()

ещё вопрос по теме префиксов. Что за префиксы «_»? Я ещё как-то видел «__», или мне показалось?

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

> Что за префиксы «_»? Я ещё как-то видел «__», или мне показалось?

обычно это системные функции, макросы и т.п.

lester ★★★★
()
Ответ на: комментарий от gods-little-toy

>> Q::Frost::DrawArea

тогда уж логичнее QFrost::GUI::DrawArea. Так как DrawArea — является виджетом qt-гуя к программе QFrost. Ещё есть математическое ядро (также использует Qt для контейнеров), доступ к классам которого тогда можно делать так: QFrost::Math::SomeMatanStuff. Такие дела :).

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

Хотя как раз этот тест не показатель.

речь шла про r/o параметры


Если параметры const _и_ передается атомарный объект, компилятор имеет все данные, чтобы сгененрировать даже более быстрый код, чем при передаче по значению.

LamerOk ★★★★★
()
Ответ на: комментарий от Obey-Kun

да, только неймспейсы таки лучше выглядят в lowercarse.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от lester

> а теперь включи оптимизацию и проверь еще раз

У меня с любыми О один и тот же результат. Но
g++ --version
g++ (GCC) 3.4.5 (mingw-vista special r3)

LamerOk ★★★★★
()

Итак, выводы:

1. m = member. Приём венгерской нотации. Говорит о том, что данная переменная — член функции. Некоторые используют m_, некоторые m. Не важно. Некоторые вообще избегают подобного и вызывают все внутренние переменные через this (http://blogs.msdn.com/ericgu/archive/2007/06/15/to-m-or-no-to-m-that-is-the-q...). Я лучше буду использовать m. Занимает меньше место, да и усложняет совершение ошибки. Алсо если у нас имеет класс внутри класса, this внесёт лишнюю функцию (хотя и m особо не поможет :)).

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

3. всё, кроме bool и маленьких полей битов передавать через константную ссылку. (верно? а что насчёт short?)

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

> g++ (GCC) 3.4.5 (mingw-vista special r3)

у меня на 4.4.2 нет никакой разницы для double и const double&, тоже самое на винде в visual

lester ★★★★
()
Ответ на: комментарий от LamerOk
obey@damnbook test % g++ ./comp.cpp 
obey@damnbook test % ./a.out 
536870911
Used time:3.850000
Used time:3.410000
obey@damnbook test % ./a.out
536870911
Used time:3.790000
Used time:3.420000
obey@damnbook test % ./a.out
536870911
Used time:3.780000
Used time:3.410000
obey@damnbook test % ./a.out       
536870911
Used time:3.780000
Used time:3.380000

Ровно наоборот.

obey@damnbook test % g++ -v
Используются внутренние спецификации.
Целевая архитектура: x86_64-unknown-linux-gnu
Параметры конфигурации: ../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++,ada --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic
Модель многопоточности: posix
gcc версия 4.4.3 (GCC)
obey@damnbook test % uname -a
Linux damnbook 2.6.32-ARCH #1 SMP PREEMPT Tue Feb 23 19:43:46 CET 2010 x86_64 Intel(R) Core(TM)2 Solo CPU U3500 @ 1.40GHz GenuineIntel GNU/Linux

С -O1..3 таймеры по нулям.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

на самом деле при -O3 разницы практически гарантированно не будет( если конечно не передать ссылку еще куда-то налево да так, что компилятор, даже с отложенной до стадии линковки оптимизацией, не сможет понять - константный это параметр или нет )

П.С. peace

lester ★★★★
()
Ответ на: комментарий от Obey-Kun

Отличить от входных переменных метода, например. Приводил же пример выше. Вот ещё один, копипаста из кода:

InternalCell::InternalCell(std::vector<double> &inDimensions, 
                           double &inTemperature, double &inMeltedPart, 
                           Phased &inCapacity, Phased &inConductivity, 
                           double &inTransitionTemperature, 
                           double &inTransitionHeat 
                           ) 
{ 
 
    dimensions = inDimensions; 
    temperature = inTemperature; 
    thawedPart = inMeltedPart; 
    capacity = inCapacity; 
    conductivity = inConductivity; 
    transitionTemperature = inTransitionTemperature; 
    transitionHeat = inTransitionHeat; 
    CalcEnthalpy(); 
    CalcInversedEffectiveConductivity(); 
} 

ты про список инициализации слышал когда-нибудь?

jtootf ★★★★★
()
Ответ на: комментарий от LamerOk
void f1(const double &arg) 
{ 
   double d = 0.0; 
   d = arg + 1.0; 
   return; 
} 
 
void f2(const double arg) 
{ 
   double d = 0.0; 
   d = arg + 1.0; 
   return; 
}

Я чего-то не понимаю, или оптимизатор по хорошему вообще должен бы выкинуть весь код этих функций.

pathfinder ★★★★
()
Ответ на: комментарий от Begemoth

надо ещё вспомнить стиль именвания структур в Windows API - SOMEVERYUSEFULSTRUCTUREWITHMAMNYMANYFIELDS

это хоть и страшно но читабельно, во всяком случае лучше нежели MITBLSMVR

shty ★★★★★
()
Ответ на: комментарий от lester

> А для разделения типов пространства имён и предназначены

но читабельности они не добавляют

4.2 это чавой-то?

в тоже время префикс 'Q', например, сразу говорит про происхождение класса и при этом не раздувает код

те же шары вид в профиль, только менее гибко... видимо сказалось тяжёлое сишное детство :)

shty ★★★★★
()
Ответ на: комментарий от LamerOk

>Алсо, 'this' помогает в длинных простынях методов

в длинных простынях методов

как только длинные простыни встречаются - это, скорее всего, bad design

shty ★★★★★
()
Ответ на: комментарий от Obey-Kun

у моих классов открытых переменных-членов как правило нет.

инкапсуляция! всем помнить, любить и знать :)

если только это не c-way структура без функций.

а её тоже так можно(хотя далеко не всегда нужно)

shty ★★★★★
()

Префиксы не нужны, для этого придумали пространства имён. Интерфейсы удобнее называть прилагательными. Любой syntax-aware редактор может отличать class member-ы от других переменных, если кому то это надо. Лучше придумывайте хорошие названия.

Legioner ★★★★★
()
Ответ на: комментарий от pathfinder

> например интеграл.

Ты правда думаешь, что push/pop будут заметны на фоне вычисления интеграла? ))

LamerOk ★★★★★
()
Ответ на: комментарий от alex_custov

а разница большая? :)

так же, как и для пост/преинкремента: для POD-типов - никакой, для всего остального - лишняя операция (неявный вызов конструктора по умолчанию)

да и просто по коду приятней, когда инициализация полей отделена от логики работы конструктора

jtootf ★★★★★
()
Ответ на: комментарий от shty

у моих классов открытых переменных-членов как правило нет.

инкапсуляция! всем помнить, любить и знать :)

предлагаю превентивно кастрировать всех программистов, считающих, что квалификатор доступа private обеспечивает инкапсуляцию

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

> предлагаю превентивно кастрировать всех программистов, считающих, что квалификатор доступа private обеспечивает инкапсуляцию

А разве нет? Но вообще, я это делаю не для инкапсуляции. Например, у класса есть два члена: внутренняя энергия и температура. По идее, при изменении одного из этих параметров, автоматически должен меняться и другой. Ясно, что тут лучше их сделать приватными и меня через SetEnthalpy(const double& inEnthalpy) и SetTemperature(const double& inTemperature)

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

инкапсуляция - это разделение интерфейса и реализации. во-первых, добиться высокой степени их независимости можно и без приватных полей (в ряде ОО-языков их вообще нет); во-вторых, просрать все полимеры можно и с ними (от большой любви к геттерам/сеттерам, например). второй пункт является локальным детектором, потому от его обсуждения я, пожалуй, откажусь :)

jtootf ★★★★★
()
Ответ на: комментарий от Obey-Kun

мм, теперь ясно, зачем нужны константные члены :)

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от jtootf

Мне и в голову не могло прийти, что ты будешь пугать ребенка этими кошмарными цепочками вызовов дочерних конструкторов.

:3

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

> Мне и в голову не могло прийти, что ты будешь пугать ребенка этими кошмарными цепочками вызовов дочерних конструкторов.

Ты же сам еще ребенок, тебе учиться, учиться и еще раз учиться!

anonymous
()
Ответ на: комментарий от jtootf

предлагаю превентивно кастрировать всех программистов, считающих, что квалификатор доступа private обеспечивает инкапсуляцию

уважаемый jtootf Вы конечно с понтами, но понты не пройдут... :) конкретно с чем не согласны? а то чёт лажа пока

shty ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.