Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

модификаторы cdecl и pascal

1.9K
25 апреля 2004 года
Fatal
75 / / 10.03.2004
Читаю в книге: cdecl - модификатор указывает компилятору, что параметры функции должны помещаться в стек в порядке справо налево. Причем функция не очищает стек. Причем:
MyFunction - имя из прототипа функции, _MyFunction - внутреннее имя функции.

Кто-нибудь понимает, что (1)за внутреннее имя функции и (2)какая разница как будут следовать параметры функции в стек, на что влияет такое следование параметров.
1.9K
25 апреля 2004 года
Fatal
75 / / 10.03.2004
И если не трудно подскажите еще зачем делать запрет на размещение в регистрах переменной с помощью ключевого слова Volatile.
461
25 апреля 2004 года
gerard
102 / / 20.12.1999
Цитата:
Originally posted by Fatal
Читаю в книге: cdecl - модификатор указывает компилятору, что параметры функции должны помещаться в стек в порядке справо налево. Причем функция не очищает стек. Причем:
MyFunction - имя из прототипа функции, _MyFunction - внутреннее имя функции.

Кто-нибудь понимает, что (1)за внутреннее имя функции и (2)какая разница как будут следовать параметры функции в стек, на что влияет такое следование параметров.



(1) Внутреннее имя - имя, которое присваивается функции компилятором и им же используется. За основу берется имя прототипа функции, к нему добавляются название класса, к которому принадлежит функция, условные обозначения для числа и типа параметров, возвращаемого типа, формата вызова (cdecl или pascal) и т.д. Именно по внутреннему имени можно различить, например, перегруженные функции (они отличаются только числом и/или типом передаваемых параметров) или переопределенные функции в базовом и производном классах (они отличаются только именем класса).

(2) Разница, разумеется, есть, и это влияет на правильную работу программы. Внутри функции для обращения к параметрам ипользуются только их адреса относительно некоторого базового адреса. Поэтому компилятор должен позаботиться о том, чтобы при вызове функции параметры располагались в стеке в том порядке, который предполагается для этой функции, иначе она просто будет использовать не те значения и результат будет непредсказуемым.

Кроме того, после вызова функции нужно освободить стек от параметров, а это можно сделать либо в конце самой функции, либо в основной программе сразу после возвращения из функции. И если это не сделано (или сделано два раза), то в стеке опять же будет совсем не та информация, которая должна быть, что приведет, скорее всего, к аварийному завершению программы.

461
25 апреля 2004 года
gerard
102 / / 20.12.1999
Цитата:
Originally posted by Fatal
И если не трудно подскажите еще зачем делать запрет на размещение в регистрах переменной с помощью ключевого слова Volatile.



Строго говоря, volatile не запрещает размещать переменные в регистрах. Оно указывает, что значение переменной может быть изменено извне программы (например, каким-нибудь устройством, операционной системой или другим потоком). Поскольку изменение может произойти в любой непредсказуемый момент, то код программы, содержащий такую переменную, компилятором никогда не оптимизируется (например, чтение ее значения выполняется всегда, даже если программа его не меняла).

1.9K
25 апреля 2004 года
Fatal
75 / / 10.03.2004
Спасибо!!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог