函数增加/减少基于整数的堆栈指针

时间:2013-07-26 01:16:44

标签: c++ c stack

基本上我有一个函数,我想根据整数变量推送一定数量的堆栈空间。所以我可以让函数一次占用3个字节,然后再占用5或6个字节。我需要将它放在堆栈而不是堆上,有没有人知道如何通过将汇编插入到我的代码中来做到这一点?

void Bar::foo(int alloc){
   //allocate data on stack the size of alloc
}

3 个答案:

答案 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?)。