基本上我有一个函数,我想根据整数变量推送一定数量的堆栈空间。所以我可以让函数一次占用3个字节,然后再占用5或6个字节。我需要将它放在堆栈而不是堆上,有没有人知道如何通过将汇编插入到我的代码中来做到这一点?
void Bar::foo(int alloc){
//allocate data on stack the size of alloc
}
答案 0 :(得分:1)
我相信alloca是您正在寻找的功能。
答案 1 :(得分:0)
spointer = spointer - alloc; //是加号还是减号......?
答案 2 :(得分:0)
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也可能为动态自动数组std::dynarray
提供C ++风格的容器。我们的想法是,如果可能的话,它们也应该在堆栈上分配(参见Why both runtime-sized arrays and std::dynarray in C++14?)。