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

Реализация __stdcall, __cdecl - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Используя механизм наследования, реализуйте на базе списка программу контроля автобусного парка http://www.cyberforum.ru/cpp-beginners/thread183975.html
Добрый вечер всем. Помогите плиз. Задание такое: Реализуйте однонаправленный список как класс. Используя механизм наследования, реализуйте на базе списка программу контроля автобусного парка. Программа должна содержать две базы данных с полями «Номер автобуса», «Водитель», «Номер маршрута». Первая база данных контролирует автобусы, находящиеся в данный момент в гараже, вторая – на маршруте. При...
C++ динамические массив подскажите пожалуйста как проще всего объявить динамические массив, кол-во элементов вводится с клавиатуры. заранее спасибо. http://www.cyberforum.ru/cpp-beginners/thread183970.html
C++ написать прогу, выводящую таблицу умножения на экран. Прога должна содержать две функции.
помогите пожалууста написать прогу, выводящую таблицу умножения на экран. Прога должна содержать две функции. Первая ф-я, которая находит произведение двух чисел, распологается после функции main. Вторая ф-я, которая выводит результат на экран, распологается до функции main
C++ Вывести на экран максимальную скорость транспорта в зависимости от введенного признака
Дан признак транспорта а-автомобиль, в-велосипед, с-самолет, п-поезд, м-мотоцикл. Вывести на экран максимальную скорость транспорта в зависимости от введенного признака
C++ Произведение многочленов http://www.cyberforum.ru/cpp-beginners/thread183965.html
Здравствуйте. Мне нужно решить задачу, вот текст: По заданным коэффициентам многочлена n-й степени А(х) и многочлена m-й степени В(х) определить коэффициенты многочлена С(х)=А(х)*В(х). Программу то написал, но она не складывает подобные члены, из-за чего получается неверный рез-тат. Вот код: #include <stdio.h> #include <conio.h> void main() { const ArrLength = 100;
C++ Что то не так с программой Написать програму которая вычисляет среднее арифметическое елементов масива #include<iostream> using namespace std; void main() { const int size = 5; float Arr = {5, 7, 3, 8, 4}; float SA =0; for(int i=0;i<size;i++) { подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
03.03.2011, 20:59     Реализация __stdcall, __cdecl
Ze, в стандарте Си++ о них ничего не написано, потому что языки программирования для того и придумывают, чтобы программист мог работать, не задумываясь о том, как реально при исполнении задачи будут передаваться параметры. А все правила передачи параметров на низком уровне описываются в программных соглашениях (ABI - application binary interface) для каждого конкретного процессора (а иногда даже на одном процессоре под разными операционными системами могут быть разные соглашения). В случае процессора x86, как мы видим, даже в рамках одной операционной системы существуют различные программные соглашения. И все эти модификаторы - это расширения исключительно компиляторов для платформы x86 (а не свойства языка Си++).

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

Например, функция с маленьким числом параметров (1-2-3 параметра). И имеется целая цепочка вызовов таких функций, при этом функции являются короткими. Ситуация характерна для всяких обработчиков ситуаций, когда функция-обработчик реально представляет собой прокладку для вызова другой функции, в том числе и какой-нибудь функции из базового класса в цепочке наследований. При таком раскладе если мы будем передавать параметры через стек, каждый раз его настраивая в функции или в точке вызова, то для прохождения такой цепочки вызовов коротких функций будут сравнительно большие затраты: очень много работы со стеком, причём работы тупой, потому что мы фактически будем заниматься только копированием параметров. Для таких случаев был заведён тип программного соглашения fastcall, при котором аргументы передаются на регистрах. А потому такая цепочка отработает очень быстро, не залезая в память (что важно на современных процессорах, потому как доступы в память являются "медленными"). Более того, если функция просто транзитно передаёт аргументы в другую функцию, то их даже копировать не надо, потому что входящие и исходящие параметры передаются на тех же самых регистрах.

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

Ну вот что-то типа того

Добавлено через 1 минуту
Цитата Сообщение от Nick Alte Посмотреть сообщение
Конвенции вызова
Вот это я называл словами "программные соглашения". Так, на всякий случай, тем кто привык к другой терминологии
 
Текущее время: 22:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru