基本上我有一个函数,我想根据一个整数变量推送一定数量的堆栈空间。所以我可以让函数一次占用 3 个字节,然后再占用 5 或 6 个字节。我需要它在堆栈而不是堆上,有谁知道如何通过将程序集插入我的代码或其他东西来做到这一点?
void Bar::foo(int alloc){
//allocate data on stack the size of alloc
}
我相信alloca是您正在寻找的功能。
C99 以及(根据当前草案)C++14 提供动态数组,即自动存储数组,但运行时确定大小。
由于标准没有提到堆栈(至少没有在内存中预定位置的意义上),因此不能保证动态数组是在堆栈上分配的,但一般的理解是它们是。
例如,GCC 提供的实现保证了它: http: //gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
以下是如何使用动态自动数组char
根据您的规范分配缓冲区:
#include <iostream>
#include <algorithm>
void foo(int alloc) {
/* Allocate data on the stack, the size of `alloc`. */
char c[alloc];
/* Do something with the buffer. I fill it with 'a's. */
std::fill(c,c+alloc,'a');
/* And print it. */
for (int i = 0; i < alloc; ++i)
std::cout << c[i];
std::cout << std::endl;
}
int main()
{
int alloc;
std::cin >> alloc;
foo(alloc);
return 0;
}
(显然,如果您想使用此缓冲区存储大于 的对象char
,您可能需要确保对齐,即您可能必须在缓冲区内移动几个字节才能获得正确对齐的地址。)
C++14 也可能为动态自动数组提供 C++ 风格的容器,std::dynarray
. 这个想法是,如果可能的话,它们也应该在堆栈上分配(参见为什么在 C++14 中同时使用运行时大小的数组和 std::dynarray?)。
指针 = 指针 - 分配;// 是加号还是减号...?