惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
博客园 - 叶小钗
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
爱范儿
爱范儿
小众软件
小众软件
K
Kaspersky official blog
P
Proofpoint News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
V
Vulnerabilities – Threatpost
博客园_首页
Microsoft Security Blog
Microsoft Security Blog
C
Cybersecurity and Infrastructure Security Agency CISA
V
V2EX
C
Check Point Blog
S
Schneier on Security
P
Palo Alto Networks Blog
IT之家
IT之家
GbyAI
GbyAI
T
Threat Research - Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Apple Machine Learning Research
Apple Machine Learning Research
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
Project Zero
Project Zero
Y
Y Combinator Blog
V
Visual Studio Blog
Simon Willison's Weblog
Simon Willison's Weblog
T
Threatpost
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
S
Securelist
C
CERT Recently Published Vulnerability Notes
A
Arctic Wolf
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理

博客园 - woaiusd

claude各种客户端的关系 pytorch对大模型推理,实现简单的对话 Agent原理与模拟 为红米Note 5 Pro编译Lineage OS 15.1的各种坑 C语言调用DIRECT3D的实例代码,通过lpVtbl字段进行 OBS插件学习入门:一个非常简单的、调节音量的filter 从工程角度看C++观察者模式中的接口是否需要提供默认的实现 Windows音频SDK的发展历程 为什么需要超出48K的音频采样率,以及PCM到DSD的演进 wireshark使用笔记 managed_shared_memory.construct造成的性能损失 java.lang.NullPointerException Ubuntu中QT使用FFmpeg的奇怪问题 QT开启C++11的支持 尝鲜CodeBlocks ops中set_sysclk set_clkdiv set_pll详解 在内核中异步请求设备固件firmware的测试代码 探究MaxxBass音效 Alsa驱动snd_soc_read的底层实现 Device Drivers Should Not Do Power Management 探究platform_driver中“多态”思想 - woaiusd 探究platform_driver中的shutdown用途
闲话__stdcall, __cdecl, __fastcall出现的历史背景以及各自解决的问题
woaiusd · 2017-11-15 · via 博客园 - woaiusd

可以认为最先由微软搞出来了__stdcall, 其实就是和WINAPI的声明是一样的,入栈顺序是从右到左,函数返回时,会进行出栈操作。

PASCAL语言是非常古老的编程语言,在C语言之前,因此在当时的时代中,PASCAL的调用约定也是__stdcall

后来在C语言中发现__stdcall不支持变长参数的函数调用,比如printf,可以携带任意N个参数。我们查看WINDOWS的API,是找不到类似这样的函数声明的。 因此在C语言中,就使用了另外一种调用约定:__cdecl ,为了解决任意参数的问题,它把出栈的工作交给了调用者,而不是在函数内部进行出栈,因为调用者是知道传递了多少个参数的。比如printf,调用printf的代码知道究竟传递了多少个参数进去,那么在函数返回后,它自然就知道要出栈多少个参数了。

__cdecl因为由调用者清理栈,在函数被频繁调用时,整个程序中会生成大量的出栈代码,因此最终程序体积会稍大。

在说__fastcall之前,我们先聊聊目前移动设备中的处理器:ARM芯片,ARM中的函数调用都是通过寄存器传递的,并没有通过入栈和出栈来传递参数。 WHY?答案就是性能。因此历史上的BORLAND公司的C++BUILDER提供了__fastcall的调用约定,参数都是通过寄存器来进行传递,只有寄存器不够时,才使用栈来操作。而微软对于__fastcall的支持并不是很广泛。可见当时C++BUILDER及VCL组件技术上确实非常牛逼,秒杀微软VC中的MFC。

__fastcall的返回方式类似于__stdcall,函数返回时进行出栈操作(如果有用到栈的话),因此它也不支持可变参数。

参考:http://blog.csdn.net/zjwoody/article/details/7887988