Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Chainyk
15 / 15 / 1
Регистрация: 24.08.2010
Сообщений: 94
#1

Компилятор влияет на результат!!! - C++

03.12.2010, 23:34. Просмотров 1636. Ответов 27
Метки нет (Все метки)

Есть такая программа:
C++
1
2
3
4
5
6
7
int _tmain(int argc, _TCHAR* argv[])
{
        const long l = 10;
        *((long*)&l) = 200;
        printf ("%d", l);
        return 0;
}
По умолчанию компилируеться как С++ и выводит 10, но когда правой кнопкой кликнуть по проекту и изменить в свойствах настройки компиляции как чистый С, тогда выводит 200. Подскажите почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2010, 23:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Компилятор влияет на результат!!! (C++):

Компилятор (Visual C++ 6.0) в плохой совместимости с Windows 7. Посоветуйте другой компилятор - C++
Здравствуйте! Я недавно начал заниматься С++, но мой компилятор (Visual C++ 6.0) в плохой совместимости с Windows 7 Посоветуйте какой...

Влияет ли на производительность - C++
Влияет ли на производительность определение(тоесть реализация) функций внутри класса, а также использование вложенных классов?

Задачу создать 2-мя способами:1) передавать результат работы подпрограммы через результат, возвращаемый функци - C++
Здравствуйте, дорогие форумчане! Будьте добры, помогите не совсем опытному юзеру разобраться с небольшим непониманием : дано условие (см....

Объяснить результат и вывести на экран результат логического выражения - C++
Объяснить результат и вывести на экран результат логического выражения T = S для заданных значений логических переменных a, b, c. ...

На что влияет разрядность библиотеки? - C++
Здравствуйте, я переустановил WIN, до этого писал первую программу с расчетом на то, что она пойдет как можно большего числа пользователей,...

Влияет ли конструктор на выделение памяти под объект? - C++
Прочёл в книге Р.Лафоре "Объектно-ориентированное программирование в С++:" Подобно конструкторам, деструкторы не возвращают значения и...

27
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
04.12.2010, 12:23 #16
ИМХО
для такого:
C++
1
2
3
4
5
6
#include<iostream>
const int N=10;
int main(){
   char array[N];
.........
}
память выделена не будет.
0
Evg
Эксперт CАвтор FAQ
17941 / 6172 / 411
Регистрация: 30.03.2009
Сообщений: 16,942
Записей в блоге: 27
04.12.2010, 14:24 #17
То, что запускаются разные компиляторы (а точнее, трансляторы) для разного типа настроек - ещё ничего не доказывает. Деление на cc1 и cc1plus - чисто техническое. Разработчики могли бы вместо двух компиляторов (трансляторов) сделать один и результат был бы точно таким же.

Ответ на поставленный вопрос единственный - тест некорректный, потому как содержит внутри себя undefined behaviour. Разные компиляторы могут выдать разный результат. И даже один и тот же компилятор может показать разные результаты при работе с оптимизациями и без них. Всё зависит от внутреннего устройства компилятора.

В конкретно данном случае рискну предположить следующее. Стандарт Си++ позволяет const переменные использовать в качестве, например, размерности массива, а потому компилятор Си++ в момент обработки конструкции "const int a = 20;" сразу же запоминает, что значение переменной "a" равно 20, а потом любое обращение к переменной заменяет на константу (а переменную не строит вообще). В языке Си этого нет, а потому компилятор для технической простоты этого не делает
1
Chainyk
15 / 15 / 1
Регистрация: 24.08.2010
Сообщений: 94
05.12.2010, 01:20  [ТС] #18
Evg, спасибо, очень качественный ответ
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
05.12.2010, 15:14 #19
Цитата Сообщение от Kastaneda Посмотреть сообщение
ИМХО
для такого:
C++
1
2
3
4
5
6
#include<iostream>
const int N=10;
int main(){
   char array[N];
.........
}
память выделена не будет.
C++
1
2
3
4
5
6
7
8
const int l = 10;
 
int main()
{        
                *((int*)&l) = 200;
                printf ("%d", l);
        return 0;
}
Bash
1
Output: 1   Segmentation fault
0
Evg
Эксперт CАвтор FAQ
17941 / 6172 / 411
Регистрация: 30.03.2009
Сообщений: 16,942
Записей в блоге: 27
05.12.2010, 15:19 #20
По поводу примера из #19. На современных платформах ГЛОБАЛЬНЫЕ const переменные компилятор складывает в специальную секцию, где на уровне ОС запрещены записи. Именно поэтому тест сломался на исполнении. Скорее всего сломался он в момент записи (т.е. если выкинем printf, то падение будет точно таким же). А вот если переменная локальная, то она положится в стек, где уже нет возможности запретить запись
1
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
05.12.2010, 15:21 #21
Evg, и я о том же
все зависит от воли компилятора
0
Evg
Эксперт CАвтор FAQ
17941 / 6172 / 411
Регистрация: 30.03.2009
Сообщений: 16,942
Записей в блоге: 27
05.12.2010, 15:26 #22
Цитата Сообщение от alex_x_x Посмотреть сообщение
все зависит от воли компилятора
Так с этим вроде бы никто и не спорил
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
05.12.2010, 16:02 #23
Так значит, то что константы записываются в таблицу имен при компиляции (т.е. память для них не выделяется) это всего навсего решение компилятора? Просто в "Философия С++" написано так, что я подумал это подразумевается стандартом.
0
Evg
Эксперт CАвтор FAQ
17941 / 6172 / 411
Регистрация: 30.03.2009
Сообщений: 16,942
Записей в блоге: 27
05.12.2010, 16:13 #24
Цитата Сообщение от Kastaneda Посмотреть сообщение
Так значит, то что константы записываются в таблицу имен при компиляции (т.е. память для них не выделяется) это всего навсего решение компилятора? Просто в "Философия С++" написано так, что я подумал это подразумевается стандартом.
В данном примере компилятору ничего не остаётся, как завести переменную. Точно так же, если глобальная переменная НЕ static, то компилятор не имеет права её не создавать (потому как к ней могут быть обращения в других модулях)

C
1
2
const int a = 10;
const int *p = &a;
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
05.12.2010, 16:24 #25
Т.е. если переменная объявлена как const, то место под нее выделяется лишь по необходимости. Если такой необходимости нет, то компилятор будет с ней работать как с define'ом. Так?
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
05.12.2010, 16:25 #26
Цитата Сообщение от Kastaneda Посмотреть сообщение
то компилятор будет с ней работать как с define'ом
что значит как с дефайном?
есть вариант, что на уровне команд ассма вместо адреса памяти будет напрямую подставлено значение
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
05.12.2010, 16:27 #27
Цитата Сообщение от alex_x_x Посмотреть сообщение
есть вариант, что на уровне команд ассма вместо адреса памяти будет напрямую подставлено значение
Об этом и речь.


Цитата Сообщение от alex_x_x Посмотреть сообщение
что значит как с дефайном?
Значит не как с :
C++
1
const int a=5;
а как с:
C++
1
#define a 5
0
Evg
Эксперт CАвтор FAQ
17941 / 6172 / 411
Регистрация: 30.03.2009
Сообщений: 16,942
Записей в блоге: 27
05.12.2010, 16:39 #28
Цитата Сообщение от Kastaneda Посмотреть сообщение
Т.е. если переменная объявлена как const, то место под нее выделяется лишь по необходимости. Если такой необходимости нет, то компилятор будет с ней работать как с define'ом. Так?
Грубо говоря, да. Но в этом отношении компилятор Си ничем не отличается от компилятора Си++. Различие между ними состоит в том, что в первом необязательно таскать за собой значение в процессе разбора текста, а во втором - обязательно. А потому и технически работа с const'ами в компиляторах Си и Си++ реализована по разному
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2010, 16:39
Привет! Вот еще темы с ответами:

На что влияет правильный выбор типа данных? - C++
Вопрос банальный. Предлагаю некий мозговой штурм. Сам не очень владею этой темой. Код работает с целыми числами. Для целых чисел в с++...

На что влияет расположение строчки using namespace std; ? - C++
В учебнике вывод предлагают делать так: 1-ый способ: #include &lt;iostream&gt; int main() { std::cout &lt;&lt; &quot;Hello World!&quot; &lt;&lt;...

Родительский класс неявно влияет на значение переменной наследника - C++
Написал элементарную программу на тему наследования: есть родительский класс, у которого есть 2 наследника. У наследников есть свои...

Влияет ли манипуляторы hex,oct,dec на массив символов? - C++
Влияет ли манипуляторы hex,oct,dec на массив символов? есть unsigned char str; Ввожу и так cin &gt;&gt; hex &gt;&gt; str; и так cin &gt;&gt; str; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Yandex
Объявления
05.12.2010, 16:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru