在调用者的堆栈上分配内存

Jos*_*osh 1 c++ stack memory-management calling-convention

我使用MSVC++ 2012用C++编写,我的代码针对的是x86平台.我有一种情况,写一个函数(除其他外)可以在CALLING函数的堆栈上分配一些内存是有利的.我不打算在这篇文章中辩论这样做的智慧,而只是考虑技术可行性.

我的实现计划是将我的函数编写为裸函数,并在内联汇编中使用自定义prolog代码.在prolog中,我首先确定我需要多少内存,然后将返回地址,参数和此指针向下移动到该堆栈中.最后,我会根据该数量调整堆栈指针.如果我没有弄错,这将在调用函数的堆栈上创建一个区域.

有没有人看到该计划中有任何漏洞?

Pup*_*ppy 6

一个明显的缺点是x64不支持内联汇编,因此将来限制您的可移植性.

另一个明显的缺点是调用函数将期望堆栈指针相对于其本地的某个位置,它不再是.我相信编译器生成的代码无法应对这种情况.这种不和谐的一个简单例子是生成的代码不知道要弹出多少堆栈空间.

我观察到你想要做的唯一方法是使用默认参数.你可以这样做

int f(void* p = alloca(55)) {
}
Run Code Online (Sandbox Code Playgroud)

从技术上讲,由于在调用函数中计算了默认参数,因此这将从调用函数的堆栈中分配内存.但是,您可能会观察到核心问题是计算您需要多少空间.