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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопросы к операции const_cast 
:(
    Опции темы
LeonidPr
Дата 17.2.2012, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(mes @ 16.2.2012,  11:45)
Цитата(novice2011 @  16.2.2012,  10:18 Найти цитируемый пост)
 но после исправления этой ошибки все остается по-прежнему. 

все ли ?  с этой ошибкой не происходило изменения значения, а сейчас происходит, даже если вывод этого не показывает  smile
вообщем если у вас выводится старое значение, то  это не чудеса  smile, а проделки компилятора  smile
вот это поможет поправить вывод :
Код

    volatile const int b = 2;
    volatile const int & x = b;
    int& c = const_cast<int &>(x);

Заинтересовала эта тема (особенно в плане проделок компилятора), решил попробовать запустить этот пример с вашими исправлениями. И столкнулся с интересной особенностью компиляторов. После сборки и запуска примера в C++ Builder 5 получил вывод в консоли: 3 3 2 (т.е. в качестве значения b выводится то, что ей присвоили). Компиляция этого примера компилером gcc дала результат: 3 3 3. Возможно необходимо ковырять настройки Builder-а, но оптимизацию я полностью отключил.
Решил посмотреть, что-же генерит Builder. Скормил exe-шник ida и получил следующее (комментарии мои):
Код

.text:00401150 ; int __cdecl main(int argc,const char **argv,const char *envp)
.text:00401150 _main           proc near              
.text:00401150 
.text:00401150 var_c           = dword ptr -0Ch
.text:00401150 var_x           = dword ptr -8
.text:00401150 var_b           = dword ptr -4
.text:00401150 argc            = dword ptr  8
.text:00401150 argv            = dword ptr  0Ch
.text:00401150 envp            = dword ptr  10h
.text:00401150 
.text:00401150                 push    ebp
.text:00401151                 mov     ebp, esp
.text:00401153                 add     esp, 0FFFFFFCCh

;volatile const int b = 2
.text:00401156                 mov     [ebp+var_b], 2

;volatile const int  &x = b
.text:0040115D                 lea     eax, [ebp+var_b]
.text:00401160                 mov     [ebp+var_x], eax

;int &c = const_cast<int &>(x)
.text:00401163                 mov     edx, [ebp+var_x]
.text:00401166                 mov     [ebp+var_c], edx

;c = 3
.text:00401169                 mov     ecx, [ebp+var_c]     ;в ecx загружаем адрес b
.text:0040116C                 mov     dword ptr [ecx], 3   ;меняем значение b

;cout << c
.text:00401172                 mov     eax, [ebp+var_c]
.text:00401175                 push    dword ptr [eax]
.text:00401177                 push    ds:@std@cout    ; std::cout
.text:0040117D                 call    @std@_basic_ostream$c19std@_char_traits$c__@$blsh$qi ; std::basic_ostream<char,std::char_traits<char>>::operator<<(int)
.text:00401182                 add     esp, 8
;cout << x
.text:00401185                 mov     edx, [ebp+var_x]
.text:00401188                 push    dword ptr [edx]
.text:0040118A                 push    ds:@std@cout    ; std::cout
.text:00401190                 call    @std@_basic_ostream$c19std@_char_traits$c__@$blsh$qi ; std::basic_ostream<char,std::char_traits<char>>::operator<<(int)
.text:00401195                 add     esp, 8
;cout << b (собственно то, что искали)
.text:00401198                 push    2
.text:0040119A                 push    ds:@std@cout    ; std::cout
.text:004011A0                 call    @std@_basic_ostream$c19std@_char_traits$c__@$blsh$qi ; std::basic_ostream<char,std::char_traits<char>>::operator<<(int)

Получается, как было уже сказано mes, "не изменяется" и "выводится старое значение" это разное поведение.
Компилятор при выводе константы запихнул в стек не то значение, которое расположено в памяти, выделенной для этой константы, а то значение, которым её инициализировали при объявлении.

Это сообщение отредактировал(а) LeonidPr - 17.2.2012, 09:37
--------------------
pkunzip.zip
PM MAIL   Вверх
mes
Дата 17.2.2012, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(boostcoder @  17.2.2012,  03:09 Найти цитируемый пост)
зачем вы гадаете? 

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


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


pattern`щик
****


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

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



Цитата(mes @  17.2.2012,  09:37 Найти цитируемый пост)
даже если по ссылке показывает эту ошибку

не понял..
т.е. тут результат не верный?

Добавлено через 57 секунд
ааа, точно smile 
странно...
PM WWW   Вверх
boostcoder
Дата 17.2.2012, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



newbee бдит!
PM WWW   Вверх
novice2011
Дата 18.2.2012, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


Эксперт
****


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

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



novice2011, а что тут понимать? Язык С++ очень мощный. На нем можно и легкое быстрое приложение состряпать для встраиваемого девайса, а можно и распределенную систему промышленного уровня написать за вменяемые сроки. Но за все надо платить: язык содержит в себе ряд спорных особенностей (иногда даже ошибок проектирования самого языка), которые при неправильном использовании могут сильно усложнить жизнь. Поэтому, чтобы все эти особенности освоить, нужно огромное время изучения и практики.
Если ты чувствуешь в себе силы всю жизнь учиться, а так же желание писать программы, то добро пожаловать к нам - С/С++ программистам. Если же тебе хочется только попробовать, то можешь начать с что-нибудь попроще.
PM   Вверх
novice2011
Дата 18.2.2012, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, bsa. Хочется стать таким же грамотным, как ребята, которые помогли мне уяснить некоторые моменты, поэтому остается только утроить свои усилия по изучению языка.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

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


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

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


 




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


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

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