модификаторы cdecl и pascal
MyFunction - имя из прототипа функции, _MyFunction - внутреннее имя функции.
Кто-нибудь понимает, что (1)за внутреннее имя функции и (2)какая разница как будут следовать параметры функции в стек, на что влияет такое следование параметров.
Читаю в книге: cdecl - модификатор указывает компилятору, что параметры функции должны помещаться в стек в порядке справо налево. Причем функция не очищает стек. Причем:
MyFunction - имя из прототипа функции, _MyFunction - внутреннее имя функции.
Кто-нибудь понимает, что (1)за внутреннее имя функции и (2)какая разница как будут следовать параметры функции в стек, на что влияет такое следование параметров.
(1) Внутреннее имя - имя, которое присваивается функции компилятором и им же используется. За основу берется имя прототипа функции, к нему добавляются название класса, к которому принадлежит функция, условные обозначения для числа и типа параметров, возвращаемого типа, формата вызова (cdecl или pascal) и т.д. Именно по внутреннему имени можно различить, например, перегруженные функции (они отличаются только числом и/или типом передаваемых параметров) или переопределенные функции в базовом и производном классах (они отличаются только именем класса).
(2) Разница, разумеется, есть, и это влияет на правильную работу программы. Внутри функции для обращения к параметрам ипользуются только их адреса относительно некоторого базового адреса. Поэтому компилятор должен позаботиться о том, чтобы при вызове функции параметры располагались в стеке в том порядке, который предполагается для этой функции, иначе она просто будет использовать не те значения и результат будет непредсказуемым.
Кроме того, после вызова функции нужно освободить стек от параметров, а это можно сделать либо в конце самой функции, либо в основной программе сразу после возвращения из функции. И если это не сделано (или сделано два раза), то в стеке опять же будет совсем не та информация, которая должна быть, что приведет, скорее всего, к аварийному завершению программы.
И если не трудно подскажите еще зачем делать запрет на размещение в регистрах переменной с помощью ключевого слова Volatile.
Строго говоря, volatile не запрещает размещать переменные в регистрах. Оно указывает, что значение переменной может быть изменено извне программы (например, каким-нибудь устройством, операционной системой или другим потоком). Поскольку изменение может произойти в любой непредсказуемый момент, то код программы, содержащий такую переменную, компилятором никогда не оптимизируется (например, чтение ее значения выполняется всегда, даже если программа его не меняла).