Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неожиданные особенности инкапсуляции 
V
    Опции темы
mr_kaspersky
Дата 16.11.2007, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 16.11.2007

Репутация: нет
Всего: нет



Добрый день, уважаемые жители форума !

Недавно я столкнулся с новой для меня проблемой в разработке на C++, хотя занимаюсь этим
уже около двенадцати лет. За все это время я участвовал в нескольких крупных проектах с 
объектно-ориентированным уклоном и, надо сказать, непреодолимых трудностей не возникало.
До поры, до времени. 

Собственно проблема такова:

Я создаю некоторую сущность, наделяю ее некоторыми свойствами:

/** An example */
struct S1
{
    /** Default constructor */
    S1() { m_count = 0;}
    
    /** Increase internal variable */    
    void inc() {m_count++;}     
    
    int m_count; /**< Counter  */
};

Затем, где S1 видна, я начинаю с ней общаться: 

...
S1 s1;
s1.inc();
std::cout  << s1.m_count << std::endl;
...

Недавно я обратил внимание, что (например в устной речи) часто используется
слово "класс", и, как я понял по контексту, это ничто иное как struct. Недавно я
с удивлением обнаружил зарезервированное слово class в синтаксисе языка.   
Да, вроде бы все хорошо, однако когда я меняю в определении S1
слово struct на слово class, я получаю ошибку компиляции ! Почему ?

Пробовал я на разных компиляторах, gcc, intel, borland, нигде не выходит.
Выдает сообщение об ошибке. Например, gcc говорит:
./example.cpp: In function 'int main()':
./example.cpp:7: error: 'S1::S1()' is private
./example.cpp:17: error: within this context
./example.cpp:10: error: 'void S1::inc()' is private
./example.cpp:18: error: within this context
./example.cpp:12: error: 'int S1::m_count' is private
./example.cpp:19: error: within this context
Причем здесь private ? Частный, личный или, наконец, персональный. Ну да, 
он действительно принадлежит S1. В чем  тут ошибка ?

С нетерпением жду ваших советов. 



PM MAIL   Вверх
Greeen
Дата 16.11.2007, 20:44 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 7
Всего: 18



Извините конечно, но вы уверены, что занимались языком C++?
В C++ по умолчанию члены класса имеют доступ private.

Добавлено через 1 минуту и 39 секунд
В вашем примере конструктор класса, метод inc() и переменная m_count являются закрытыми. О чем вам компилятор, кстати, очень доходчиво говорит.


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
Daevaorn
Дата 16.11.2007, 20:55 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Greeen абсолютно прав, а автору топика совсем не вериться по части опыта.
PM MAIL WWW   Вверх
bsa
Дата 16.11.2007, 23:21 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Код
class Object
{
       ...
};
тоже самое, что и
Код
struct Object
{
private:
       ...
};
Думаю, стоит почитать умную книжку по С++, дабы себя не компромитировать.
PM   Вверх
archimed7592
Дата 17.11.2007, 17:04 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(mr_kaspersky @  16.11.2007,  20:37 Найти цитируемый пост)
m_count++;

За двенадцать то лет, можно было бы выработать рефлекс писать ++m_count smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
fish9370
Дата 17.11.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Цитата(archimed7592 @ 17.11.2007,  17:04)
Цитата(mr_kaspersky @  16.11.2007,  20:37 Найти цитируемый пост)
m_count++;

За двенадцать то лет, можно было бы выработать рефлекс писать ++m_count smile.

а какая в данном случае разница?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Lazin
Дата 17.11.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



ребят, надо быть проще, над вами тут кажется немного постебались, а вы повелись))

Добавлено через 1 минуту и 29 секунд
Цитата(fish9370 @  17.11.2007,  22:27 Найти цитируемый пост)
а какая в данном случае разница? 

для типа инт никакой, а для итераторов есть
PM MAIL Skype GTalk   Вверх
Daevaorn
Дата 17.11.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(fish9370 @  17.11.2007,  23:27 Найти цитируемый пост)
а какая в данном случае разница? 

никакой. но говорит о стиле.
PM MAIL WWW   Вверх
fish9370
Дата 17.11.2007, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Цитата(Daevaorn @ 17.11.2007,  22:30)
Цитата(fish9370 @  17.11.2007,  23:27 Найти цитируемый пост)
а какая в данном случае разница? 

никакой. но говорит о стиле.

ну и чем плох такой стиль, если понимать, что происходит..  как в данном случае, нарасчивать обычный счетчик?

Это сообщение отредактировал(а) fish9370 - 18.11.2007, 01:17


--------------------
undefined
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 17.11.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(fish9370 @  17.11.2007,  22:37 Найти цитируемый пост)
ну и чем плох такой стиль, если понимать, что происходит..  как в данном случае нарасчивать обычный счетчик? 

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alek86
Дата 17.11.2007, 22:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(fish9370 @  17.11.2007,  22:37 Найти цитируемый пост)
как в данном случае нарасчивать обычный счетчик?

написано ж: ++m_count

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
fish9370
Дата 18.11.2007, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Цитата(Alek86 @ 17.11.2007,  22:55)
Цитата(fish9370 @  17.11.2007,  22:37 Найти цитируемый пост)
как в данном случае нарасчивать обычный счетчик?

написано ж: ++m_count

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


там запятая была пропущена, см. поправку..

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

2 MAKCim: можно объяснить мне, в чем выражается эффективность? (при условии, что нам нужно нарасчивать счетчик)

Это сообщение отредактировал(а) fish9370 - 18.11.2007, 01:22


--------------------
undefined
PM MAIL WWW ICQ   Вверх
DjoNIK
Дата 18.11.2007, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Цитата(fish9370 @  18.11.2007,  01:16 Найти цитируемый пост)
я все-таки не могу себе представить, чтобы изначально задуманный счетчик, вдруг, с фонаря, кто-то решил делать итератором

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

Цитата(fish9370 @  18.11.2007,  01:16 Найти цитируемый пост)
в чем выражается эффективность?

Как минимум в том, что при префиксной инкриментации не создается никаких временных объектов, а при постфиксной - создается


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
fish9370
Дата 18.11.2007, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Цитата(DjoNIK @  18.11.2007,  01:33 Найти цитируемый пост)
итератором можно использовать как "счетчик адреса" (если чуж очень грубо говоря)


нет про счетчик адреса - это высосанно из пальца.. тут ясно идет речь о обычном счетчике, который обычно именуют count (или counter).. счетчик, например, в котором учитывается количество посетителей на сайте или число кликов.. или число проданых товаров..



Цитата(DjoNIK @  18.11.2007,  01:33 Найти цитируемый пост)
Как минимум в том, что при префиксной инкриментации не создается никаких временных объектов, а при постфиксной - создается 


а можно мне это продемонстрировать, как это выглядит на АСМе?

Это сообщение отредактировал(а) fish9370 - 18.11.2007, 01:45


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 18.11.2007, 01:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(fish9370 @  18.11.2007,  02:44 Найти цитируемый пост)
а можно мне это продемонстрировать, как это выглядит на АСМе?

Тут не нужен асм, а важна семантика С++ в отношении пре/пост-фиксного инкремента. В стандарте явно прописано, что и когда произходит. Понятно, что компилятор умный и всё оптимизирует и не будет создавать временный объект. Но зачем до этого доводить? Тем более, как уже сказали выше, в будущем меньше придется изменять при использовании другого более "тяжелого" типа.
PM MAIL WWW   Вверх
fish9370
Дата 18.11.2007, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Цитата(Daevaorn @ 18.11.2007,  01:58)
Цитата(fish9370 @  18.11.2007,  02:44 Найти цитируемый пост)
а можно мне это продемонстрировать, как это выглядит на АСМе?

Тут не нужен асм, а важна семантика С++ в отношении пре/пост-фиксного инкремента. В стандарте явно прописано, что и когда произходит. Понятно, что компилятор умный и всё оптимизирует и не будет создавать временный объект. Но зачем до этого доводить? Тем более, как уже сказали выше, в будущем меньше придется изменять при использовании другого более "тяжелого" типа.

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

можно мне цитату из стандарта, а то что-то я подзабыл, что там конкретно написанно?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
JackYF
Дата 18.11.2007, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(fish9370 @  18.11.2007,  02:23 Найти цитируемый пост)
в будущем ничего менять не придется, еще раз повторяю,

 smile это поначалу так думается. После второй-третьей перекройки исходника вдоль и поперёк начинаешь осознавать обратное smile

Программа пишется не один раз. А хорошая программа - далеко не один раз.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
fish9370
Дата 18.11.2007, 04:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Цитата(JackYF @  18.11.2007,  03:16 Найти цитируемый пост)
это поначалу так думается. После второй-третьей перекройки исходника вдоль и поперёк начинаешь осознавать обратное 


ну если это так, то никого не смущает, тот факт, что придется менять переменную m_count на нечто вроде iterator? всех только волнует, что нужно менять m_count++ на ++m_count? и то спорно, примеров пока так никто и не привел.. кто-то "блеснул стилем" и понеслась это круто, а это не круто.. только доказательства какие-то неубедительные..

по мне так это одно и тоже.. работы столько же.. планировать нужно заранее, меньше переделывать придется..

Добавлено @ 04:14
и еще мне нравится забота о компиляторе, несчастненьком, давайте будем все делать за него.. ему молоко за вредность давать нужно.. 

если код выглядит логичнее, то так оно и лучше.. а на проблемы компилятора мне начхать!!

Это сообщение отредактировал(а) fish9370 - 18.11.2007, 04:23


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Dims
Дата 18.11.2007, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Цитата(mr_kaspersky @  16.11.2007,  20:37 Найти цитируемый пост)
Недавно я обратил внимание, что (например в устной речи) часто используется
слово "класс", и, как я понял по контексту, это ничто иное как struct.


Это не совсем верно. В структуре все члены по умолчанию публичные. Чтобы их сделать приватными, нужно это явно указать. А в классе, наоборот, все члены по умолчанию приватные. Чтобы они были публичными, нужно это специально указать.

А больше, действительно, отличий нет.

В Вашем случае, чтобы работало, надо написать:

Код

class S1
{

public:

    /** Default constructor */
    S1() { m_count = 0;}
    
    /** Increase internal variable */    
    void inc() {m_count++;}     
    
    int m_count; /**< Counter  */
};


Здесь метка public: делает всё нижеследующего публичным, как в структуре.

Собственно, без public/private инкапсуляция, как идея, становится неполной. По правилам инкапсулирования, Вы должны пометить private всё то, чем "не положено" пользоваться извне. В результате класс станет "чёрным ящиком", пользоваться которым можно только через небольшое число public членов. Залезть в "чёрный ящик" в обход предусмотренного нельзя, это его private зона.

Добавлено @ 07:10
Цитата(fish9370 @  17.11.2007,  22:27 Найти цитируемый пост)
а какая в данном случае разница? 

Мне тоже кажется, что никакой. Но я сам помню, действительно, что начиная с какого-то времени мне стало нравиться использовать префиксную форму. Правда, только в цикле for, а в данном случае я бы тоже написал постфиксно.

Добавлено @ 07:18
Цитата(Daevaorn @  16.11.2007,  20:55 Найти цитируемый пост)
а автору топика совсем не вериться по части опыта. 

Наоборот! В 12 как раз верится. Вот в 5 я бы не поверил. А 12 лет назад у нас не было даже компьютерных факультетов, а, может, и компьютеров (я уже забыл). Все учились самоучками, а самоучка отличается тем, что в его навыках всегда присутствуют вот такие вот "странности". Вполне можно поверить, что он 12 лет успешно использовал struct в крупных проектах.


Это сообщение отредактировал(а) Dims - 18.11.2007, 07:19
PM MAIL   Вверх
Ln78
Дата 18.11.2007, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



 smile 
Dims (и не только), неужели Вы всерьёз полагаете, что человек с таким ником, знающий слово инкапсуляция, не в состоянии разобраться в вопросе, который он задал? Не стоит воспринимать всё так уж буквально. smile  И кстати, непонятно, как я ухитрился примерно 2 раза по 12 лет назад поступить на компьютерный факультет, когда их ещё не было?  ВМиК МГУ появился в 1970г, хотя в "моё время" С++ не изучали.
PM MAIL   Вверх
archimed7592
Дата 18.11.2007, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Нафлудили то сколько... 0_о

fish9370, тут дело больше не в "понимаю что происходит"/"не понимаю"/"заменю на итератор"/"не заменю", а в рефлексе.
Если ты всегда используешь пре*кремент, и только когда нужно(реально нужно), пост*кремент, то никогда у тебя никаких проблем не возникнет smile.
Это тоже самое, что рефлекс писать const, писать explicit у конструкторов и подобные мелочи от которых "разницы" нет.

Добавлено через 3 минуты и 43 секунды
Цитата(Dims @  18.11.2007,  07:05 Найти цитируемый пост)
Вполне можно поверить, что он 12 лет успешно использовал struct в крупных проектах.

Ага, и жил в заповеднике, где наглые обезьяны и носороги скрывали от него существование class smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 18.11.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(fish9370 @  18.11.2007,  01:44 Найти цитируемый пост)
а можно мне это продемонстрировать, как это выглядит на АСМе?

Код

int i = 0;
i++;

Код

...
mov dword [ebp - 4], 0
mov eax, dword [ebp - 4]
push eax ; создание временной переменной
inc eax
mov dword [ebp - 4], eax
pop eax
...

Код

int i = 0;
++i;

Код

...
mov dword [ebp - 4], 0
inc dword [ebp - 4]
...

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

Добавлено @ 11:17
Цитата(fish9370 @  18.11.2007,  04:09 Найти цитируемый пост)
и еще мне нравится забота о компиляторе, несчастненьком, давайте будем все делать за него.. ему молоко за вредность давать нужно.. 
если код выглядит логичнее, то так оно и лучше.. а на проблемы компилятора мне начхать!!

для меня лично человек будет выглядеть более знающим (по крайней мере при первом знакомстве с его кодом), если он напишет ++count, а не count++ в случае если оба варианта в данном контексте равносильны
кроме того, вопрос спорный, что выглядит более логичным
по мне так эти два варианта оба логичны
я еще раз повторяю, тут вопрос в стиле
как говорится, покажи мне свой код, и я скажу кто ты  smile 

Это сообщение отредактировал(а) MAKCim - 18.11.2007, 11:37


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 18.11.2007, 13:42 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Насчёт заботы о компиляторе:
c-cast vs c++-cast
void * vs T *
assignment vs constructor
уже упомянутое T vs const T
int vs enumeration
manual resource managment vs RAII
exception unsafety vs exception safety
Список можно долго продолжать.
Несмотря на то, что, по сути, для "X vs Y" результат будет одинаковым как при использовании X, так и Y, то что во втором "столбце" должно быть как минимум привычкой, а по хорошему - рефлексами, а при использовании конструкций из первого "столбца" внутри должен срабатывать громогласный alarm.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
fish9370
Дата 18.11.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



приму к сведению..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
JackYF
Дата 18.11.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  18.11.2007,  13:42 Найти цитируемый пост)
c-cast vs c++-cast
void * vs T *
assignment vs constructor
уже упомянутое T vs const T
int vs enumeration
manual resource managment vs RAII
exception unsafety vs exception safety

ППКС.

Не всегда удаётся полностью это сделать, но всегда, имхо, надо стараться и уж никак не ратовать за "компилятор умный, он сам всё за меня сделает". Это не оправдание плохого стиля.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 18.11.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(JackYF @  18.11.2007,  17:47 Найти цитируемый пост)
Не всегда удаётся полностью это сделать,

0_o.
Я понимаю, что не всегда удаётся выдерживать стиль полностью, но, тот короткий список, что я привёл - IMHO, может "не всегда удаваться" только в случае жесткого(очень жесткого) навязывания этого какими-либо внешними факторами, на которые ты никак не можешь повлиять(габаритная, криво спроектированная библиотека, написание wrapper'а к которой - большая потеря времени; начальство, навязывающее некоторый стиль, не соответствующий твоему идеалу и т.п.), но, даже в таких случаях такие места очень просто локализовать, т.о. исключив распространения плохого стиля повсеместно в коде...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 19.11.2007, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(archimed7592 @  18.11.2007,  13:42 Найти цитируемый пост)
то что во втором "столбце" должно быть как минимум привычкой, а по хорошему - рефлексами

Только не в отношении

Цитата(archimed7592 @  18.11.2007,  13:42 Найти цитируемый пост)
c-cast vs c++-cast
T vs const T

А это

Цитата(archimed7592 @  18.11.2007,  13:42 Найти цитируемый пост)
int vs enumeration

вообще непонятно что такое.

Это сообщение отредактировал(а) UnrealMan - 19.11.2007, 02:38
PM MAIL   Вверх
archimed7592
Дата 19.11.2007, 04:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(UnrealMan @  19.11.2007,  02:21 Найти цитируемый пост)
Только не в отношении

Почему?
Где хороши c-cast'ы?
Чем хорошо не делать переменную константной, если ей незачем меняться?

Цитата(UnrealMan @  19.11.2007,  02:21 Найти цитируемый пост)
вообще непонятно что такое.

Код

const int MY_ENUM_RED = 0;
const int MY_ENUM_GREEN = 1;
const int MY_ENUM_BLUE = 2;

...

void A::changeColor(int color)
{ ... }
...
a.changeColor(MY_ENUM_RED);

vs
Код

enum Color { red, green, blue };
...
void A::changeColor(Color color)
{ ... }
...
a.changeColor(red);


Добавлено через 37 секунд
Пример с цветами конечно неудачный(цвета как раз лучше представлять в виде машинного слова), но, если заменить на кошек, собак и утюги, то будет самое то smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Dims
Дата 19.11.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Цитата(Ln78 @  18.11.2007,  07:50 Найти цитируемый пост)
Dims (и не только), неужели Вы всерьёз полагаете, что человек с таким ником, знающий слово инкапсуляция, не в состоянии разобраться в вопросе, который он задал?

Конечно, вероятность шутки велика. Но точно мы знать этого не можем. Кроме того, если это шутка, то тоже странная. Не очень смешная.

PM MAIL   Вверх
UnrealMan
Дата 19.11.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(archimed7592 @  19.11.2007,  04:32 Найти цитируемый пост)
Где хороши c-cast'ы?

Там, где смысл преобразования очевиден и один вид преобразования никак не может быть спутан с другим. Например, если нужно произвести дробное деление, имея две целочисленные величины:

int x, y;
....
double result = (double)x/y;

static_cast здесь не имеет никаких преимуществ. Наоборот, поскольку он занимает гораздо больше места, его присутствие только ухудшит читаемость кода. Приведение в функциональной нотации (которое всё-таки относится к C++-cast) - это почти то же самое, что C-cast.

Цитата(archimed7592 @  19.11.2007,  04:32 Найти цитируемый пост)
Чем хорошо не делать переменную константной, если ей незачем меняться?

Дилемма в том, что не всегда точно известно, будет ли переменная меняться. Делая переменную неконстантной, мы оставляем пространство для манёвра - читай делаем код сопровождаемым. Кроме того, const не всегда способствует читаемости, поскольку опять же удлиняет и нагромождает код. Поэтому надобность по умолчанию ("на уровне рефлексов") всюду пичкать const как минимум спорна. "Незачем меняться" - это слабый аргумент для того, чтобы делать саму переменную константной (не хочешь менять - не меняй и всё). Вот если объект обязан быть неизменным в пределах достаточно большой области видимости, тогда другое дело.

Цитата(archimed7592 @  19.11.2007,  04:32 Найти цитируемый пост)
Пример с цветами конечно неудачный

Неудачное - это название сравнения "int vs enumeration".
PM MAIL   Вверх
archimed7592
Дата 19.11.2007, 15:04 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(UnrealMan @  19.11.2007,  14:53 Найти цитируемый пост)
Делая переменную неконстантной, мы оставляем пространство для манёвра - читай делаем код сопровождаемым.

А что мешает убрать спецификатор const, в случае необходимости изменения переменной?

Цитата(UnrealMan @  19.11.2007,  14:53 Найти цитируемый пост)
поскольку опять же удлиняет и нагромождает код

И способствует самодокументированности кода - сразу понятно, что данная переменная далее по тексту нигде не изменится.

Цитата(UnrealMan @  19.11.2007,  14:53 Найти цитируемый пост)
Неудачное - это название сравнения "int vs enumeration". 

Ну вот Кусто, по всей видимости, понял, что я имел ввиду smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 19.11.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(archimed7592 @  19.11.2007,  15:04 Найти цитируемый пост)
А что мешает убрать спецификатор const, в случае необходимости изменения переменной?

А не факт, что придётся убрать только этот спецификатор. Например, может понадобиться заменять все const_iterator на iterator, потому что нам захотелось модифицировать контейнер, который мы раньше считали неизменным, используя итератор.

Цитата(archimed7592 @  19.11.2007,  15:04 Найти цитируемый пост)
И способствует самодокументированности кода - сразу понятно, что данная переменная далее по тексту нигде не изменится.

А ты уверен, что это такая уж полезная информация? Особенно если "далее по тексту" - это одна-две-три строчки (дальше переменная просто не живёт) и её неизменность и без того очевидна.





Это сообщение отредактировал(а) UnrealMan - 19.11.2007, 15:26
PM MAIL   Вверх
Ln78
Дата 19.11.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



Цитата(Dims @  19.11.2007,  12:25 Найти цитируемый пост)
Конечно, вероятность шутки велика. Но точно мы знать этого не можем. Кроме того, если это шутка, то тоже странная. Не очень смешная.

Думаю, если бы вопрос топикстартеру был интересен, вряд ли он ограничился бы единственным сообщением. Да и сам стиль вопроса меня наводит на мысль, что это была попытка породить дискуссию подобную этой
PM MAIL   Вверх
JackYF
Дата 19.11.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  18.11.2007,  17:59 Найти цитируемый пост)
т.о. исключив распространения плохого стиля повсеместно в коде... 

увы, я столкнулся с тем, что если в наследие досталась пачка местами кривого кода, в котором "забыли" порасставлять const, причём даже в самых очевидных местах и я не могу передать в функцию const char*, так как она принимает char*, хотя на деле его не изменяет, а эта функция используется повсеместно в самых разных местах и даже программах, и сама завязана на ещё одной такой же... то тут возникает логичный вопрос: переписать и переотладить тысячи строк кода или старые куски использовать по-старому, а уже новый код писать нормально.

Я же сказал - "не всегда", но надо стараться. Что я с большим рвением и делаю.


Цитата(archimed7592 @  19.11.2007,  15:04 Найти цитируемый пост)
Ну вот Кусто, по всей видимости, понял, что я имел ввиду

Кстати, да. И понял и поддерживаю.
Я тебя вообще хорошо понимаю, как-то так сложилось smile Эх, про "Кусто" не забыл, значит smile))

Цитата(Ln78 @  19.11.2007,  15:24 Найти цитируемый пост)
что это была попытка породить дискуссию 

имхо, дискуссии без личных выпадов полезны, это же не флейм без темы.
Цитата(UnrealMan @  19.11.2007,  15:24 Найти цитируемый пост)
Например, может понадобиться заменять все const_iterator на iterator, потому что нам захотелось модифицировать контейнер, который мы раньше считали неизменным, используя итератор.

Очень правильно. Тогда да, мы пойдём и заменим типы. А вот если наоборот, то есть если мы забудем поставить const там, где сейчас у нас константная работа и случайно запишем по итератору, то компилятор не даст по рукам и будет прав. Имхо, чем больше const там, где переменные константны, пускай даже сейчас, тем лучше.

Чем строже ведёт себя программист по отношению к коду, тем прямее получается код.
Цитата(UnrealMan @  19.11.2007,  15:24 Найти цитируемый пост)
А ты уверен, что это такая уж полезная информация?

Да, довольно полезная. Через неделю в эту функцию вставят ещё пять строчек. А через месяц ещё пять. Много понадобится памяти, дабы запомнить, что где "должно" быть константным, но const не поставлено...



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 19.11.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(JackYF @  19.11.2007,  16:02 Найти цитируемый пост)
А вот если наоборот, то есть если мы забудем поставить const там, где сейчас у нас константная работа и случайно запишем по итератору, то компилятор не даст по рукам и будет прав. 

Ну и что? Это достоинство const, да. Но помимо достоинств, есть и недостатки. Что весомее? Тут нет однозначного "лучше". И лично я предпочту воздержаться от использования const. Начали-то с оператора ++, там префиксный ++ однозначно как минимум не хуже, чем постфиксный. В случае с const такой однозначности нет.

Цитата(JackYF @  19.11.2007,  16:02 Найти цитируемый пост)
Да, довольно полезная.

Ну, для тебя, может, полезная, для меня - абсолютно бесполезная и даже вредная.
PM MAIL   Вверх
JackYF
Дата 19.11.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(UnrealMan @  19.11.2007,  16:34 Найти цитируемый пост)
В случае с const такой однозначности нет.

const на скорость не влияет, поэтому показатель субъективный. Следовательно, я допускаю, что кому-то const использовать не всегда удобно.
Принято.

Цитата(UnrealMan @  19.11.2007,  16:34 Найти цитируемый пост)
для меня - абсолютно бесполезная и даже вредная. 

Ясно.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
zkv
Дата 19.11.2007, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(JackYF @  19.11.2007,  18:51 Найти цитируемый пост)
const на скорость не влияет

теоретически он может помочь оптимизатору.
PM MAIL   Вверх
Alek86
Дата 19.11.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(zkv @  19.11.2007,  19:22 Найти цитируемый пост)
теоретически он может помочь оптимизатору.


не буду спорить, но товарищ Саттер насчет этого довольно резко высказывался smile
(Герб Саттер "Новые сложные задачи на C++")


--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 19.11.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(zkv @  19.11.2007,  19:22 Найти цитируемый пост)
теоретически он может помочь оптимизатору. 

А может и наоборот нагадить, если по совету Мейерса возвращать константный объект вместо обычного. В критичном к скорости участке кода без const можно вызвать неконстантный метод прямо для временного объекта, вместо того, чтобы тупо создавать копию. Например, присваивание

result = a+b;

без const элементарно заменяется swap-ом

(a+b).swap(result);
PM MAIL   Вверх
bsa
Дата 19.11.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(UnrealMan @ 19.11.2007,  20:42)
result = a+b;

без const элементарно заменяется swap-ом

(a+b).swap(result);

операция swap в общем случае более затратна, чем присваивание. И к тому же, менее наглядна.


Посмотрел мнение Саттера по поводу const. Думаю, он прав. const редко дает оптимизацию, зато позволяет избегать ошибок.
А разговоры о том, что когда-то метод не менял свой параметр, а потом вдруг стал менять и в случае с использыванием const возникнет куча проблем - глупы. Если у тебя такое получилось, то сам виноват - неправильный дизайн. Лучше уж написать еще одну функцию, которая выполняет нужные действия, чем ловить баги от "неправомерного" использования старой (в надежде, что она не меняет параметр).
И вообще, зачем писать функции на сотни строк, в которых может возникнуть проблема замены большого количества "const_iterator" на "iterator"? Имхо, 30-60 строк на функцию/метод - больше не стоит без крайней необходимости.
PM   Вверх
archimed7592
Дата 19.11.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(UnrealMan @  19.11.2007,  15:24 Найти цитируемый пост)
А не факт, что придётся убрать только этот спецификатор. Например, может понадобиться заменять все const_iterator на iterator, потому что нам захотелось модифицировать контейнер, который мы раньше считали неизменным, используя итератор.

Ну, тут уже другая дилема - всего не предусмотришь... Ессно, случаи разные бывают.

Цитата(UnrealMan @  19.11.2007,  15:24 Найти цитируемый пост)
А ты уверен, что это такая уж полезная информация? Особенно если "далее по тексту" - это одна-две-три строчки (дальше переменная просто не живёт) и её неизменность и без того очевидна.

Не, не, не... Даже в 1-ой строке бывает минибаг, который сразу не увидишь и которого при строгой константности могло бы не быть. Ты же отлично знаешь сколько в С++ тонкостей smile.
Ещё один ньюанс: если ты НЕ видишь спецификатора const, то тебе нужно помимо общей логики работы последующих 3 строчек ещё и задумываться о возможности изменения данной переменной. Учитывая, опять же, невообразимое множество тонкостей языка - это, IMHO, совсем не нужная нагрузка на мозг.


Цитата(Ln78 @  19.11.2007,  15:24 Найти цитируемый пост)
Думаю, если бы вопрос топикстартеру был интересен, вряд ли он ограничился бы единственным сообщением. Да и сам стиль вопроса меня наводит на мысль, что это была попытка породить дискуссию подобную этой 

Кстати, почему-то такие тупые "вопросы" почему-то частенько порождают такие интересные дискуссии smile.

Цитата(UnrealMan @  19.11.2007,  16:34 Найти цитируемый пост)
Но помимо достоинств, есть и недостатки. Что весомее? Тут нет однозначного "лучше".

Вся наша жизнь состоит из альтернатив. Универсальных решений/подходов не бывает. Но при прочих равных, я бы предпочёл поставить спецификатор const. К примеру, раньше мне было непонятно какое может быть применение у нестатических константных членов. Сейчас мне их применение очень даже понятно, и я переодически их использую(в частности в текущем проекте их просто туева хуча).

Цитата(zkv @  19.11.2007,  19:22 Найти цитируемый пост)
теоретически он может помочь оптимизатору. 
Цитата(Alek86 @  19.11.2007,  19:28 Найти цитируемый пост)
не буду спорить, но товарищ Саттер насчет этого довольно резко высказывался smile
Таки да - на данный момент это исключительно теория smile. IIRC, даже в бустовом гайде для разработчиков либ есть rational относительно безполезности использования const.

Цитата(bsa @  19.11.2007,  21:14 Найти цитируемый пост)
Имхо, 30-60 строк на функцию/метод - больше не стоит без крайней необходимости. 

Ну я бы не сказал что прям таки без крайней. У меня частенько возникает потребность писать "одноразовый" код, разбивать который на маленькие ф-ции большого смысла нет, а скорее даже может запутать. Да и таскать туда-сюда контекст в таких случаях бывает накладно.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 19.11.2007, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(archimed7592 @ 19.11.2007,  22:02)
Цитата(bsa @  19.11.2007,  21:14 Найти цитируемый пост)
Имхо, 30-60 строк на функцию/метод - больше не стоит без крайней необходимости. 

Ну я бы не сказал что прям таки без крайней. У меня частенько возникает потребность писать "одноразовый" код, разбивать который на маленькие ф-ции большого смысла нет, а скорее даже может запутать. Да и таскать туда-сюда контекст в таких случаях бывает накладно.

Именно это я и имел в виду под "крайней необходимостью". Действительно, никакого смысла городить огород ради программы на 200 строчек.
PM   Вверх
archimed7592
Дата 20.11.2007, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(bsa @  19.11.2007,  23:48 Найти цитируемый пост)
Именно это я и имел в виду под "крайней необходимостью". Действительно, никакого смысла городить огород ради программы на 200 строчек. 

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 20.11.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(bsa @  19.11.2007,  21:14 Найти цитируемый пост)
операция swap в общем случае более затратна, чем присваивание. 

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

Цитата(bsa @  19.11.2007,  21:14 Найти цитируемый пост)
А разговоры о том, что когда-то метод не менял свой параметр, а потом вдруг стал менять и в случае с использыванием const возникнет куча проблем - глупы. 

Читай внимательней топик. Речь шла о переменных.

Цитата(archimed7592 @  19.11.2007,  22:02 Найти цитируемый пост)
Ещё один ньюанс: если ты НЕ видишь спецификатора const, то тебе нужно помимо общей логики работы последующих 3 строчек ещё и задумываться о возможности изменения данной переменной.

Это ещё зачем?

Цитата(archimed7592 @  19.11.2007,  22:02 Найти цитируемый пост)
совсем не нужная нагрузка на мозг

Ну так и не ищи себе вымышленных проблем.
PM MAIL   Вверх
bsa
Дата 20.11.2007, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(archimed7592 @ 20.11.2007,  00:02)
Ты не понял smile. Не программы, а ф-ции smile.

Я все тогда понял. Просто ответил не очень корректно на два замечания. Не думаешь же ты, что я ради того, чтобы уложиться в 50 строчек буду "таскать контекст"? Ничего подобного. ладно, это уже офтопик.
Цитата(UnrealMan @ 20.11.2007,  00:09)
Для потенциально больших объектов swap гораздо лучше. Надо ли говорить, что в большом количестве случаев присваивание по ряду причин выгодно реализовывать, используя идиому swap?
Код из STL:
Код
template<typename _Tp>
inline void
swap(_Tp& __a, _Tp& __b)
{
      // concept requirements
      __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)

      _Tp __tmp = __a;  //конструктор копирования создает новый объект
      __a = __b;            //выполняется первое присваивание
      __b = __tmp;        //выполняется второе присваивание
}
Ты продолжаешь утверждать, что время выполнения 2-х присваиваний и одного конструктора копирования меньше, чем одного присваивания? 


Это сообщение отредактировал(а) bsa - 20.11.2007, 12:22
PM   Вверх
archimed7592
Дата 20.11.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(bsa @  20.11.2007,  12:20 Найти цитируемый пост)
Ты продолжаешь утверждать, что время выполнения 2-х присваиваний и одного конструктора копирования меньше, чем одного присваивания?

А как же специализированный swap? smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 20.11.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(archimed7592 @ 20.11.2007,  12:38)
Цитата(bsa @  20.11.2007,  12:20 Найти цитируемый пост)
Ты продолжаешь утверждать, что время выполнения 2-х присваиваний и одного конструктора копирования меньше, чем одного присваивания?

А как же специализированный swap? smile

в общем случае специализированного же нет. но даже для int'а он работает медленней (даже с использованием инструкции ассемблера xchg) - два чтения и две записи в память.
Да, конечно, в частном случае, например, для std::string, std::vector и т.п. он может работать быстрей. Но если я для своего собственного класса специализацию не написал или если он просто большой, то будет медленней.
Разве не так?
PM   Вверх
UnrealMan
Дата 20.11.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Не понял, при чём тут STL-то? Я же метод swap вызвал. Для временного объекта по стандарту C++ ты даже не имеешь права непосредственно вызвать STL-ный swap.

Повторюсь, это

Код

T &operator =(T t)
{
    swap(t);
    return *this;
}

каноническая форма записи оператора =, применяющаяся довольно часто.

PM MAIL   Вверх
bsa
Дата 20.11.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Конструктор копирования работает быстрей, чем мог бы работать оператор присваивания, копирующий все поля?
PM   Вверх
UnrealMan
Дата 20.11.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Правда, на хорошо оптимизирующих компилях замена канонического присваивания swap-ом ничего не даст - копирующий конструктор по-любому не будет вызван smile
 
Цитата(bsa @  20.11.2007,  14:03 Найти цитируемый пост)
Конструктор копирования работает быстрей, чем мог бы работать оператор присваивания, копирующий все поля?

Нет.

Это сообщение отредактировал(а) UnrealMan - 20.11.2007, 14:18
PM MAIL   Вверх
mr_kaspersky
Дата 22.11.2007, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 16.11.2007

Репутация: нет
Всего: нет



Помечаю вопрос решенным, всем спасибо за внимание.
PM MAIL   Вверх
archimed7592
Дата 22.11.2007, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



smile
smile
smile



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 22.11.2007, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



UnrealMan, 
bsa, 
чем спорить, взяли бы и посмотрели на сгенерированный компилятором код
все станет сразу понятно, что быстрее, а что медленнее


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1200 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.